Ich habe eine Primzahl-Generator, war ich neugierig zu sehen, wie klein und wie schnell könnte ich einen Primzahl-Generator auf Optimierungen basieren und solche:Prime-Nummer Generator stürzt ab Speicherfehler, wenn es zu viele Zahlen in Array
from math import sqrt
def p(n):
if n < 2: return []
s = [True]*(((n/2)-1+n%2)+1)
for i in range(int(sqrt(n)) >> 1):
if not s[i]: continue
for j in range((i**i+(3*i) << 1) + 3, ((n/2)-1+n%2), (i<<1)+3): s[j] = False
q = [2]; q.extend([(i<<1) + 3 for i in range(((n/2)-1+n%2)) if s[i]]); return len(q), q
print p(input())
Der Generator funktioniert gut! Es ist super schnell, fühlen Sie sich frei, es auszuprobieren. Wenn Sie jedoch Zahlen größer als 10^9 oder 10^10 eingeben (denke ich), wird es von einem Speicherfehler abstürzen. Ich kann nicht herausfinden, wie ich den Speicher erweitern kann, damit er so viel wie nötig braucht. Jeder Rat würde sehr geschätzt werden!
Meine Frage ist sehr ähnlich this ein, aber das ist Python, nicht C.
EDIT: Dies ist eine der speicherbezogenen Tracebacks ich für den Versuch, bekommen 10^9 zu laufen.
python prime.py
1000000000
Traceback (most recent call last):
File "prime.py", line 9, in <module>
print p(input())
File "prime.py", line 7, in p
for j in range((i**i+(3*i) << 1) + 3, ((n/2)-1+n%2), (i<<1)+3): s[j] = False
MemoryError
* Nehmen Sie so viel wie nötig *? Sie müssen erkennen, dass 'q' eine 'liste' ist und irgendwann kein Speicher mehr zur Verfügung steht. –
@MosesKoledoye Ich schätze, das ist meine Frage - gibt es eine Möglichkeit, den Speicher zu erhöhen, bevor er abläuft? An diesem Punkt verwendet es nur ein paar tausend Megabyte. Ich habe das Gefühl, ich könnte es erhöhen. Sollte ich meine Frage aktualisieren, um das zu berücksichtigen? –
Die Vorschläge in der C-verwandten Frage, die Sie verknüpften, sollten auch auf Python gelten ... – agnul