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