是这个素数生成器pythonic

rob*_*ing 5 python primes generator

以下代码用于生成质数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)
Run Code Online (Sandbox Code Playgroud)

请注意,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)
Run Code Online (Sandbox Code Playgroud)

sen*_*rle 3

next(next_p)抛出错误并不坏StopIteration——这就是生成器在项目用完时总是做的事情!

在迭代列表时更改列表的长度是一个坏主意。但仅仅改变内容并没有什么问题。总的来说,我认为这是一个相当优雅的(即使是基本的)seive。

一个小观察:当你“划掉”素数的倍数时,如果你稍微思考一下,你会发现你不必从 开始p * 2。您可以跳至p ** 2