我正在使用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分钟了,我仍然没有输出。您是否有任何建议使其运行更快,或者我的方法是否错误?
答案 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至)以获取更多高级信息。有效的方法来计算质数,这将大大加快代码的速度。尽管您将需要学习和理解许多数学原理和细节。