我写了一个埃拉托色尼筛法,但似乎它并没有被优化到最好。虽然它可以得到所有小于N的质数,但速度并不如我所希望的快。我还在学习Python,之前两年一直在用Java,如果有些地方不太符合Pythonic的规范,请见谅:
def sieve(self):
is_prime = [False, False, True, True] + [False, True] * ((self.lim - 4) // 2)
for i in range(3, self.lim, 2):
if i**2 > self.lim: break
if is_prime[i]:
for j in range(i * i, self.lim, i * 2):
is_prime[j] = False
return is_prime
我查看过其他与此类似的问题,但是我无法弄清楚一些更复杂的优化如何适用于我的代码。有什么建议吗?
编辑:根据要求,我看到的一些其他优化是在达到限制之前停止第一个循环的迭代,以及通过不同的数字跳过循环--我认为这是轮子优化?
编辑2:这里是将使用该方法的代码,供Padraic参考:
primes = sieve.sieve()
for i in range(0, len(primes)):
if primes[i]:
print("{:d} ".format(i), end = '')
print() # print a newline
if i ** 2 > self.lim: break
行是多余的。 - jwodderrange(i * i, self.lim, 2*i)
。 - Will Ness