【发布时间】:2015-09-16 05:30:36
【问题描述】:
我已经写了一个埃拉托色尼筛法——我想——但它似乎并没有尽可能地优化。它有效,它使所有素数达到 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
我查看了与此类似的其他问题,但我无法弄清楚一些更复杂的优化如何适合我的代码。有什么建议吗?
编辑:根据要求,我看到的其他一些优化是在限制之前停止第一个 for 循环的迭代,并跳过不同的数字——我认为这是轮子优化?
编辑 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是多余的。 -
@BlackVegetable 问题已编辑。
-
切片分配是一种标准技术,可用于加速将倍数设置为 false 的内部循环。我打算输入一个答案,但一个简单的谷歌搜索产生的结果比我能得到的要好 --- 例如,codereview.stackexchange.com/questions/42420/…
-
你可以使用
range(i * i, self.lim, 2*i)。
标签: python-3.x optimization primes