Mit MemoryError in Python konfrontiert

Ich habe ein Programm geschrieben, um Primfaktoren einer Zahl zu finden. Wenn ich eine große Zahl (600851475143) als Eingabe gebe, wird MemoryError angezeigt. Unten ist der Code:

def fact(a): factors = [] for i in range(1,a+1): if a%i == 0: factors.append(i) return factors num = raw_input(">> ") #600851475143 a = b = [] a = fact(long(num)) for i in range(0,len(a)): b = fact(a[i]) if len(b) <= 2: print a[i] 

Beim Surfen habe ich erfahren, dass Python Computerspeicher verwendet – RAM. Ich verwende Python in Unbuntu, ohne die Konfiguration zu ändern. Sollte ich irgendetwas ändern, um auf einem 64-Bit-Computer zu arbeiten? Oder sollte ich zusätzliche Funktionen verwenden, um diesen Fehler zu umgehen?

Kommentare

  • Ihr grundlegendes Problem ist, dass Ihr Algorithmus wahrscheinlich zu viel verwendet Erinnerung. Wenn Sie Python 2 verwenden, versucht range(1, a+1), eine Liste mit 600851475143 Elementen zu erstellen. Dies ist wahrscheinlich nicht das, was Sie wollen, da jedes Element eine Ganzzahl ist und jede Ganzzahl 4 Bytes benötigt. (Außerdem ist diese Frage für Programmierer nicht ' geeignet, da Sie wirklich eine Codeüberprüfung benötigen und insbesondere verstehen müssen, wie Python funktioniert.)
  • (Sie möchten wahrscheinlich xrange ist ein Generator, der nach Bedarf Elemente an die for -Schleife zurückgibt. Dies ist jedoch möglicherweise nicht das einzige Problem, das Sie haben .)
  • Ihre Liste ist 2,2 TB groß. Der Wechsel zu einem 64-Bit-Computer hilft nicht. Sie müssen mehr als 2 TB RAM installieren (um fair zu sein, ist ein 64-Bit-Betriebssystem erforderlich). Oder überdenken Sie Ihren Algorithmus.
  • Zusätzlich zu Speicherproblemen (nur weil bisher noch keine anderen darauf hingewiesen haben) gibt es einige effizientere Algorithmen, um die Liste der Faktoren einer Zahl zu berechnen oder zu entscheiden ob eine Zahl eine Primzahl ist oder um eine Liste von Primzahlen zu generieren. Während die meisten Leute über Zeitkomplexität sprechen, gibt es auch das verwandte Konzept der Raumkomplexität .

Antwort

Es gibt verschiedene Möglichkeiten, den von Ihrem Programm verwendeten Speicher zu messen, und Sie können möglicherweise den Speicher erhöhen Benutzerbeschränkungen oder ähnliches.

Sie müssen diesen Speicher jedoch nicht erst zuweisen, da Sie die Sequenz nur generieren können, ohne alles zu speichern:

def fact(a): "just return a generator for the sequence you want" return (i for i in xrange(1,a+1) if a % i == 0) 

Beachten Sie, dass Sie Sequenzen auch direkt durchlaufen können, ohne sie wiederholt indizieren zu müssen:

for b in fact(long(num)): print b 

Kommentare

  • Die Liste in der Frage ist 2,2 TB groß. Ich bezweifle, dass eine Erhöhung der Ressourcenlimits hilfreich ist 😀
  • Nun, vielleicht kann das OP bis 2035 warten, wenn 8 TB SIMMS sind verfügbar.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.