Этот генератор простых чисел питонический

Является ли следующий код для генерации простых чисел питоническим?

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)
5
задан robert king 15 February 2012 в 09:03
поделиться