Ein schnelles Primzahlsieb in Python

Ich habe die Generierung von Primzahlen in Python mit dem Sieb von Eratosthenes und den Lösungen durchlaufen, die die Leute als relativ schnelle Option ankündigen, wie in einigen vondie Antworten auf eine Frage zur Optimierung der Primzahlengenerierung in Python sind nicht einfach und die einfache Implementierung, die ich hier habe, konkurriert in der Effizienz. Meine Implementierung ist unten angegeben

def sieve_for_primes_to(n):
    size = n//2
    sieve = [1]*size
    limit = int(n**0.5)
    for i in range(1,limit):
        if sieve[i]:
            val = 2*i+1
            tmp = ((size-1) - i)//val 
            sieve[i+val::val] = [0]*tmp
    return sieve


print [2] + [i*2+1 for i, v in enumerate(sieve_for_primes_to(10000000)) if v and i>0]

Das Timing der Ausführung kehrt zurück

python -m timeit -n10 -s "import euler" "euler.sieve_for_primes_to(1000000)"
10 loops, best of 3: 19.5 msec per loop

Während die Methode, die in der Antwort auf die oben verlinkte Frage als die schnellste aus dem Python-Kochbuch beschrieben wurde, unten angegeben ist

import itertools
def erat2( ):
    D = {  }
    yield 2
    for q in itertools.islice(itertools.count(3), 0, None, 2):
        p = D.pop(q, None)
        if p is None:
            D[q*q] = q
            yield q
        else:
            x = p + q
            while x in D or not (x&1):
                x += p
            D[x] = p

def get_primes_erat(n):
  return list(itertools.takewhile(lambda p: p<n, erat2()))

Beim laufen gibt es

python -m timeit -n10 -s "import euler" "euler.get_primes_erat(1000000)"
10 loops, best of 3: 697 msec per loop

Meine Frage ist, warum Leute das oben genannte vom Kochbuch anpreisen, das als der ideale Primärgenerator verhältnismäßig komplex ist?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage