È il seguente codice per la generazione di numeri primi pythonic?è questo generatore di primoni 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)
nota che il prossimo (next_p) finirà per lanciare un errore StopIteration che finisce in qualche modo i get_primes funzione. È così male?
Si noti inoltre che next_p è un generatore che esegue l'iterazione sui numeri primi, tuttavia i primi vengono modificati durante l'iterazione. È quello stile cattivo?
aggiungendo la seguente istruzione if ottiene sotto 0,25 secondi per il primo milione di numeri primi:
if p*p<=n:
primes[p*p::p]=[False]*((n-p*p)//p+1)
è possibile salvare una linea se si vuole utilizzare 'numeri primi = [False, False] + [vero] * (n-1)', aggiungendo anche la complessità è possibile ottimizzare di utilizzare la metà un setaccio, saltare i numeri pari . vedi http://stackoverflow.com/a/3035188/464543 – ChessMaster
grazie a @ChessMaster –
prova il tuo codice per 0,1,2,3 senza la riga 'se p * p <= n:' ... nella mia macchina che linea non è necessaria – ChessMaster