我在项目euler上解决了一些问题,我为问题10编写了相同的函数…
令我惊讶的是C解决方案在大约4秒内运行,而python解决方案大约需要283秒.我正在努力向自己解释为什么C实现比python实现快得多,实际发生了什么呢?
C:
#include
#include
#include
int is_prime(int num)
{
int sqrtDiv = lround(sqrt(num));
while (sqrtDiv > 1) {
if (num % sqrtDiv == 0) {
return(0);
} else {
sqrtDiv--;
}
}
return(1);
}
int main ()
{
clock_t start = clock();
long sum = 0;
for ( int i = 2; i < 2000000; i++ ) {
if (is_prime(i)) {
sum += i;
}
}
printf("Sum of primes below 2,000,000 is: %ld\n", sum);
clock_t end = clock();
double time_elapsed_in_seconds = (end - start)/(double)CLOCKS_PER_SEC;
printf("Finished in %f seconds.\n", time_elapsed_in_seconds);
}
Python:
from math import sqrt
import time
def is_prime(num):
div = round(sqrt(num))
while div > 1:
if num % div == 0:
return False
div -= 1
return True
start_time = time.clock()
tsum = 0
for i in range(2, 2000000):
if is_prime(i):
tsum += i
print tsum
print('finished in:', time.clock() - start_time, 'seconds')
最佳答案 这是CPython(实现)在这种情况下很慢,而不是Python必然. CPython需要解释字节码,它几乎总是比编译的C代码慢.它只是比同等的C代码做更多的工作.理论上,每次调用sqrt都需要查找该函数,而不仅仅是调用已知地址.
如果你想要与Python相媲美的速度,你可以使用类型注释源代码并使用Cython进行编译,或者尝试使用Pypy运行以获得一些JIT性能.