Я делаю проект Эйлера Q14.Учитывая этот же фрагмент кода, почему версия python 100x + медленнее, чем C?
Какой стартовый номер, менее одного миллиона, производит самую длинную цепь collatz?
Я был очень удивлен, увидев кого-то, кто смог получить результат в 0,7 сек. Еще больше удивляюсь, когда вижу, что это просто наивное решение для грубой силы.
Я был настроен скептически, так как потратил столько времени, чтобы оптимизировать мою версию python, получив время работы примерно до минуты. Поэтому я сам запускал код. О. П. не лгал.
Я перевел один и тот же код на Python, он не смог завершить работу через 5 минут.
Что дает?
версия C: http://codepad.org/VD9QJDkt
#include <stdio.h>
#include <time.h>
int main(int argc, char **argv)
{
int longest = 0;
int terms = 0;
int i;
unsigned long j;
clock_t begin, end;
double time_spent;
begin = clock();
for (i = 1; i <= 1000000; i++)
{
j = i;
int this_terms = 1;
while (j != 1)
{
this_terms++;
if (this_terms > terms)
{
terms = this_terms;
longest = i;
}
if (j % 2 == 0)
{
j = j/2;
}
else
{
j = 3 * j + 1;
}
}
}
printf("longest: %d (%d)\n", longest, terms);
end = clock();
time_spent = (double)(end - begin)/CLOCKS_PER_SEC;
printf("It took %f seconds\n", time_spent);
return 0;
}
Python версии: http://codepad.org/ZloPyEcz
import time
def iterative_brute_force(n):
longest = 0
terms = 0
for i in range(1, n + 1):
j = i
this_terms = 1
while j != 1:
this_terms += 1
if this_terms > terms:
terms = this_terms
longest = i
if j % 2 == 0:
j = j/2
else:
j = 3 * j + 1
return longest, terms
t0 = time.time()
print(iterative_brute_force(10 ** 6))
t1 = time.time()
total = t1-t0
print(total)
Вы ожидаете, что python будет работать быстрее, чем c? Кроме того, я думаю, проблема в вашем алгоритме python. – aIKid
Вы должны увидеть [это] (http://code.jasonbhill.com/c/project-euler-problem-14/) –
@aIKid Я не думаю удивление заключается в том, что он медленнее, но для этого требуется * столько * (не менее 300 раз) больше времени. И алгоритм для обеих программ одинаковый, так что это * не * проблема. – delnan