我正在解决一些Project Euler上的问题,需要生成200万个质数来解决一个问题。我的埃拉托色尼筛法实现非常慢,但我不知道原因。请问有人可以解释一下这种实现的主要问题吗?我认为它很漂亮,但后来发现它是完全糟糕的:(。我在网上找到了另一个实现,比我的快得多。
def generatePrimes(upperBound):
numbers = range(2,upperBound+1)
primes = []
while numbers:
prime = numbers[0]
primes.append(prime)
numbers = filter((lambda x: x%prime),numbers)
return primes
编辑:感谢所有的回答!结论是问题出在过滤器上,因为它会遍历每个元素(而不仅仅是要标记为非质数的元素),并且每次都创建一个新列表。使用传统的for循环和一轮过滤进行重写后,速度快了很多。 新代码:
def generatePrimes(upperBound):
numbers = range(2,upperBound+1)
for i in xrange(len(numbers)):
if(numbers[i] != 0):
for j in xrange(i+numbers[i],len(numbers),numbers[i]):
numbers[j] = 0
primes = filter(lambda x: x,numbers)
return primes