为什么我的算法找出小于200万的所有质数的和是如此的慢?我是一个相当初级的程序员,这是我想出的解决方案:
import time
sum = 2
start = time.time()
for number in range(3, 2000000):
prime = True
for x in range(2, number):
if number % x == 0:
prime = False
if prime:
sum += number
print "Sum =", sum
end = time.time() - start
print "Runtime =", end有谁能帮帮我吗?谢谢!
发布于 2013-07-08 18:56:03
您可以进行许多优化(而且应该这样做,因为对于project Euler中的许多问题,您将需要素数生成,因此拥有一个快速的实现可以简化以后的工作)。
看一看Atkin的筛子(以及相关的筛子) (http://en.wikipedia.org/wiki/Sieve_of_Atkin),以了解如何通过蛮力(即算法)来加速素数生成。
然后看看对这篇S.O.-post (Fastest way to list all primes below N)的精彩回答,它记录了许多素数生成算法/实现。
发布于 2013-08-14 20:52:19
你的算法使用试除法,这是非常慢的。一种更好的算法是使用Eratosthenes筛子:
def sumPrimes(n):
sum, sieve = 0, [True] * n
for p in range(2, n):
if sieve[p]:
sum += p
for i in range(p*p, n, p):
sieve[i] = False
return sum
print sumPrimes(2000000)这应该会在不到一秒的时间内运行。如果你对质数编程感兴趣,我在我的博客中谦虚地推荐这个essay。
发布于 2013-07-08 19:29:32
没有人指出这一点,但是在Python2.x中使用range非常慢。使用xrange instaed,在这种情况下,这应该会给你带来巨大的性能优势。
此外,您不必循环,直到您检查的数字,检查直到round(sqrt(n)) + 1是足够的。(如果大于它的平方的数字除以它,那么您一定已经注意到有一个比平方更小的数字。)
https://stackoverflow.com/questions/17524685
复制相似问题