下面是用于生成素数pythonic的代码?是这个素数发生器pythonic
def get_primes(n):
primes=[False,False]+[True]*(n-1)
next_p=(i for i,j in enumerate(primes) if j)
while True:
p=next(next_p)
yield p
primes[p*p::p]=[False]*((n-p*p)//p+1)
请注意next(next_p)最终会抛出一个StopIteration错误,该错误以某种方式结束函数get_primes。那不好吗?
另请注意,next_p是一个在素数上进行迭代的生成器,但素数在迭代过程中会发生变化。那是不好的风格?
加入下面的if语句得到它控制在0.25秒的第一百万质数:
if p*p<=n:
primes[p*p::p]=[False]*((n-p*p)//p+1)
可以节省一个行,如果你想使用'素数=假,假] + [真] *(N-1)',也增加了复杂性,您可以优化使用半筛子,跳过偶数。看到http://stackoverflow.com/a/3035188/464543 – ChessMaster 2012-02-15 03:59:38
谢谢@ ChessMaster – 2012-02-15 04:06:37
测试你的代码为0,1,2,3没有行'如果p * p <= n:'...在我的机器中行不需要 – ChessMaster 2012-02-15 04:20:26