Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在这个例子中,python比C慢得多的原因是什么?_Python_C - Fatal编程技术网

在这个例子中,python比C慢得多的原因是什么?

在这个例子中,python比C慢得多的原因是什么?,python,c,Python,C,我在euler项目上解决了一些问题,我为问题10写了相同的函数 令我惊讶的是,C解决方案运行时间约为4秒,而python解决方案运行时间约为283秒。我正在努力向自己解释为什么C实现比python实现快得多,到底是什么让它如此快呢 C: 在这种情况下,是CPython(实现)速度慢,而不是Python。CPython需要解释字节码,这几乎总是比编译的C代码慢。它只是比等效的C代码做更多的工作。例如,理论上,每次调用sqrt都需要查找该函数,而不仅仅是调用已知地址 如果你想让Python有相当的速

我在euler项目上解决了一些问题,我为问题10写了相同的函数

令我惊讶的是,C解决方案运行时间约为4秒,而python解决方案运行时间约为283秒。我正在努力向自己解释为什么C实现比python实现快得多,到底是什么让它如此快呢

C:

在这种情况下,是CPython(实现)速度慢,而不是Python。CPython需要解释字节码,这几乎总是比编译的C代码慢。它只是比等效的C代码做更多的工作。例如,理论上,每次调用
sqrt
都需要查找该函数,而不仅仅是调用已知地址


如果你想让Python有相当的速度,你可以用类型注释源代码并用Cython编译,或者试着用Pypy运行一些JIT性能。

如果你用的是Python 2.7,
range(220000)
实际上构建了一个大约2000000个整数的内存列表。您在C中没有做相同的等效操作。请尝试使用
xrange()
,或者切换到Python 3,其中
range()
是一个懒惰的迭代器。在Python代码中,静态类型声明和可能使用内存效率低下的迭代器与Python
div
中的生成器是浮动的,但是
sqrtDiv
在您的C代码中是int。
round(sqrt(num))->int(sqrt(num)+1)
提供了2.5倍的速度提升。我不认为range和xrange在这种情况下有什么区别。修复上面提到的int/float错误使python版本比C慢21倍。对于在小int上进行大量求和的代码来说,这是正确的。
#include <stdio.h>
#include <time.h>
#include <math.h>

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);   
}
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')