Juste pour clarifier, ce n'est pas un problème de devoir :)
Je voulais trouver des nombres premiers pour une application mathématique que je suis en train de créer et je suis tombé sur Le tamis d'Eratosthène approche.
J'en ai écrit une implémentation en Python. Mais c'est terriblement lent. Par exemple, si je veux trouver tous les nombres premiers inférieurs à 2 millions. Cela prend > 20 minutes. (Je l'ai arrêté à ce stade). Comment puis-je accélérer le processus ?
def primes_sieve(limit):
limitn = limit+1
primes = range(2, limitn)
for i in primes:
factors = range(i, limitn, i)
for f in factors[1:]:
if f in primes:
primes.remove(f)
return primes
print primes_sieve(2000)
UPDATE : J'ai fini par faire du profilage sur ce code et j'ai constaté que beaucoup de temps était passé à retirer un élément de la liste. C'est assez compréhensible si l'on considère qu'il faut parcourir toute la liste (dans le pire des cas) pour trouver l'élément, le supprimer, puis réajuster la liste (peut-être qu'il y a des copies ?). Bref, j'ai remplacé la liste par le dictionnaire. Ma nouvelle implémentation -
def primes_sieve1(limit):
limitn = limit+1
primes = dict()
for i in range(2, limitn): primes[i] = True
for i in primes:
factors = range(i,limitn, i)
for f in factors[1:]:
primes[f] = False
return [i for i in primes if primes[i]==True]
print primes_sieve1(2000000)