Является ли следующий код для генерации простых чисел 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_p) в конечном итоге вызовет ошибку StopIteration, которая каким-то образом завершит функцию get_primes. Это плохо?
Также обратите внимание, что next_p - это генератор, который выполняет итерацию по простым числам, однако переменные меняются во время итерации. Это плохой стиль?
добавление следующего выражения if получает его менее 0,25 секунды для первого миллиона простых чисел:
if p*p<=n:
primes[p*p::p]=[False]*((n-p*p)//p+1)