Python需要很长时间才能执行代码

时间:2018-07-18 14:40:27

标签: python performance execution

我正在使用PyCharm社区2018。我试图找到1到200万之间的素数之和,这是我的代码。

primes = [x for x in range (1,2000000) if all (x%y!=0 for y in range (2,x))]
total = 0
for x in primes:
    total = total + x
print (total)

已经20分钟了,我仍然没有输出。您是否有任何建议使其运行更快,或者我的方法是否错误?

3 个答案:

答案 0 :(得分:2)

这很可能是因为您找到质数的方法效率低下并且范围太大。

您的算法是寻找质数的一种蛮力方式,它的time complexity是O(n²)。如果您为较小的数字计时,您会发现随着n的增加,花费的时间不会线性增加,但实际上是二次的。

+--------+---------------+
|   n    | time(in sec)  |
+--------+---------------+
| 1000   |  0.007979     |
| 2000   |  0.038865     |
| 5000   |  0.137037     |
| 10000  |  0.499688     |
| 20000  |  1.892315     |
| 50000  |  10.29843     |
| 100000 |  1374.101     |
| ...    |  ...          |
+--------+---------------+

我建议您看看Sieve of Eratosthenes。搜索时,您会以所需的任何语言找到许多implementations

答案 1 :(得分:1)

我建议使用多重处理来加快代码的速度

from multiprocessing import Pool
def find_prime(n):
    #code to determine prime number here
    #return 0 if it is not prime or the number if it is

pool=Pool()
total=sum(pool.map(find_prime,range(1,2000000))

答案 2 :(得分:0)

您的代码正确。有很多方法可以获取所有质数,并且您使用的是最基本的定义,这就是为什么代码很慢的原因。您可以参考这篇文章(有很多方法可以获取所有素数,并且您使用的是最基本的定义,这就是为什么代码很慢的原因。您可以参考这篇文章Fastest way to list all primes below N至)以获取更多高级信息。有效的方法来计算质数,这将大大加快代码的速度。尽管您将需要学习和理解许多数学原理和细节。

相关问题