2015-03-24 2 views
0

Следующим является мой ответ на проект Euler's third problem. Вот реализация питон:Код Python медленнее, чем тот же код на C++?

def isPrime(n): 
    for i in range(n/2)[3::2]: 
     if n % i == 0: 
      return False 
    return True 

def largestPrime(n): 
    for i in range(3, n/2): 
     if n % i == 0 and isPrime(n/i): 
      return n/i 
    return -1 

largestPrime(600851475143) 

И здесь та же реализация переписан в C++:

#include <iostream> 
using namespace std; 

bool isPrime(long n) 
{ 
    for(int i = 3; i < n/2; i+=2) 
    { 
     if(n % i == 0) 
      return false; 
    } 
    return true; 
} 

long largestPrime(long n) 
{ 
    for(int i = 2; i < n/2; i++) 
    { 
     if(n % i == 0 and isPrime(n/i)) 
      return n/i; 
    } 
    return -1; 
} 

int main() 
{ 
    cout << largestPrime(600851475143) << endl; 
    return 0; 
} 

Когда я запускаю код C++, он вычисляет правильный ответ (6857) в течение нескольких секунд. Но когда я запускаю код python, он, кажется, продолжается вечно. Что это такое, что производительность python здесь настолько бедна?

+0

'Python' - это тот, кто открывает дверь и снимается. «C++» - это тот, кто стучит. –

+0

Я не знаком с python, но работает ли 'range' с 64-битными целыми числами? – Matthew

+0

Что такое 'sizeof (long)' для вашей C++-программы? Если это 32 бита, число, которое вы переходите на 'maximumPrime', будет усечено, и если ответ будет правильным, то, скорее всего, алгоритму по совпадению не нужны биты более высокого порядка, но он может работать не надежно для всех остальных чисел , Python - с другой стороны - использует что-то логически похожее на C++-библиотеку GMP для обработки целых чисел произвольной длины, хотя и намного медленнее. –

ответ

2

А) Python интерпретируется, С компилируется. Последний класс почти всегда быстрее первого.

B) isPrime Выполнено несколько раз. В нем у вас есть range(n/2)[3::2], который будет строить (довольно большой) массив много раз. Напротив, ваш C-код имеет простой цикл, без выделения памяти и инициализации.

C) Вопрос о вопросе Тони D может иметь свои достоинства. Проверьте свой размер long.

+1

'cout'' sizeof (long) 'выводит' 8' на консоль. Я также запускал код, используя 'long long', и потребовалось примерно столько же времени. – hmir

+0

Тогда это не C). Попробуйте заменить 'range (n/2) [3 :: 2]' на 'range (3, n/2, 2)', что должно дать вам итератор без создания списка для исключения B). Нет ничего, что можно было бы сделать в отношении A) ... кроме изменения алгоритма (например, memoizing 'isPrime' результаты по мере того, как вы идете, поэтому вам не придется пересчитывать их все время). – Amadan

+0

Nope - такой же результат. Я даже пытался использовать 'while i hmir

2

Его потому, что Python является интерпретированным языком, а C++ - скомпилированным языком.

См. Этот вопрос переполнения стека для более подробного описания различий между ними. Обратите внимание, что это касается его поверхности.

Compiled vs. Interpreted Languages

Также смотрите эту страницу на сайте Python для кратких описаний Python по сравнению с другими языками программирования.

https://www.python.org/doc/essays/comparisons/

+0

Спасибо за ссылки. Я обязательно прочитаю это. – hmir

0

Python, как упоминалось ранее, является интерпретированным языком, но еще одним недостатком является то, что вы скорее всего запускаете его через IDE, такую ​​как IDLE или IDLE3. Они сделаны С Python и могут занимать больше процессора, чем скомпилированный язык, такой как C++. Надеюсь, это помогло в любом случае в вашу пользу. ~ Th3T3ch13

Смежные вопросы