【发布时间】:2014-01-20 18:51:43
【问题描述】:
为什么第一个比第二个快这么多?我知道将素数存储为 1 和 0 更简单,但速度的提高是荒谬的。最后,它仍然遍历了一个长达 200 万个项目的列表,这怎么可能在 1 秒内完成编译?
def prime_sieve(limit):
primes = [1 for x in xrange(limit)]
primes[0] = 0
primes[1] = 0
imax = int(math.sqrt(limit) + 1)
i = 2
while (i < imax):
j = i + i
while j < limit:
primes[j] = 0
j += i
while True:
i += 1
if primes[i] == 1:
break
return primes
s = prime_sieve(2000000)
print(sum(i for i in xrange(len(s)) if s[i] == 1))
-----------------------------------------------------------
def sieve(max):
primes = range(2, max+1)
for i in primes:
j = 2
while i * j <= primes[-1]:
if i * j in primes:
primes.remove(i*j)
j += 1
return primes
count = 0
for x in sieve(2000000):
count += x
print count
【问题讨论】:
-
这个问题似乎是题外话,因为它属于codereview.stackexchange.com
-
在两个最外面的循环中添加一个
print i,并为一些小的输入运行这两个函数,比如100。看看在这两个函数中测试了哪些数字! -
代码中有一个错误(除了函数
sieve内部明显错误的缩进):从底部算起的第6行应该与上面的if取消缩进相同的水平它。
标签: python python-2.7 primes sieve-of-eratosthenes