¿El siguiente código para generar primos es pythonic?es este generador de primos 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)
Tenga en cuenta que el próximo (next_p) finalmente lanzar un error StopIteration que de alguna manera termina la función get_primes. ¿Es tan malo?
También tenga en cuenta que next_p es un generador que itera sobre primos, sin embargo los primos cambian durante la iteración. ¿Es ese mal estilo?
agregando la siguiente instrucción if pone debajo de 0,25 segundos para el primer millón de números primos:
if p*p<=n:
primes[p*p::p]=[False]*((n-p*p)//p+1)
puede guardar una línea si desea usar 'primos = [Falso, falso] + [Real] * (n-1)', también añadir complejidad puede optimizar el uso medio de un tamiz, omita los números pares . vea http://stackoverflow.com/a/3035188/464543 – ChessMaster
gracias @ChessMaster –
pruebe su código para 0,1,2,3 sin la línea 'si p * p <= n:' ... en mi máquina que línea no es necesaria – ChessMaster