【发布时间】:2011-04-25 18:37:54
【问题描述】:
澄清一下,这不是作业问题:)
我想为我正在构建的数学应用程序找到素数,并遇到了Sieve of Eratosthenes 方法。
我已经用 Python 编写了它的实现。但这非常慢。比如说,如果我想找到所有小于 200 万的素数。它需要> 20分钟。 (我在这一点上停止了它)。如何加快速度?
def primes_sieve(limit):
limitn = limit+1
primes = range(2, limitn)
for i in primes:
factors = range(i, limitn, i)
for f in factors[1:]:
if f in primes:
primes.remove(f)
return primes
print primes_sieve(2000)
更新: 我最终对这段代码进行了分析,发现从列表中删除一个元素花了很多时间。考虑到它必须遍历整个列表(最坏情况)才能找到元素然后删除它然后重新调整列表(也许还有一些副本?),这是可以理解的。无论如何,我把字典列表扔掉了。我的新实现 -
def primes_sieve1(limit):
limitn = limit+1
primes = dict()
for i in range(2, limitn): primes[i] = True
for i in primes:
factors = range(i,limitn, i)
for f in factors[1:]:
primes[f] = False
return [i for i in primes if primes[i]==True]
print primes_sieve1(2000000)
【问题讨论】:
-
这里有一个类似的问题stackoverflow.com/questions/2897297,您可能会觉得有用。
-
检查that 答案。
-
@Srikar:您可以只迭代到 limit 的平方根,而不是迭代到 limit 的平方根,因为字典中的任何合数都会比 limit 的平方根少一个因子。
-
对
range使用step参数非常棒。factors用词不当,应为multiples。
标签: python math primes sieve-of-eratosthenes