下面是用於生成素數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