Memory vs. CPU

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Quicktrader
User
Beiträge: 16
Registriert: Freitag 6. November 2015, 20:24

Aktuell ein Programm (im Original ca. 200 lines inkl. Aho-Corasick Algorithmus), welches - hier vereinfacht - im Grunde gut funktioniert:

Code: Alles auswählen

...
alph = ["A", "B", "C"..."Z"]
lex = [""ABC", "BCD", "CDE", "DEF"]
for A, B, C in [(A,B,C) for A in alph for B in alph for C in alph...for E in alph]:
        text = A+B+C
        if any text in lex
        	print ("text")
Das Programm iteriert also drei Variablen [26^3] und vergleicht die Ergebnisse ("text") mit einer Wortliste ("lex"). Wenn man nun jedoch anstatt drei Variablen insgesamt 12 Variablen iteriert, knallt es den Arbeitsspeicher zusammen [26^12]. Dazu hätte ich ein paar Fragen:

1. Warum wird der Arbeitsspeicher überhaupt für die Iteration in Anspruch genommen? Der Speicher ist logischerweise knackevoll, die CPU hingegen so gut wie unbelastet..

2. Kann man Python dazu bringen, die Iteration "Schritt für Schritt" ablaufen zu lassen? Anstatt die komplette Iteration zunächst in den Arbeitsspeicher packen zu wollen?

3. Welche Möglichkeiten hat man, den durch die Iteration auf jeden Fall entstehenden "Memory Overflow" zu umgehen? Bitte um detaillierte Infooo..

Für Eure Antworten vielen Dank..bin erst seit zwei Monaten ein Pythonist und das Programm funktioniert an sich...aber am Memory Overflow scheitert es, sobald ich mein Anliegen tatsächlich umsetzen will..

QT
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Quicktrader: der Speicher wird belegt, weil Du eine Liste mit allen 26^12 Werten erzeugst. Das "Schritt für Schritt ablaufen" nennt sich bei Python Generator und wird mit Runden statt mit eckigen Klammern geschrieben. Für Deinen Fall gibt es aber schon eine fertige Funktion, itertools.combinations_with_replacement:

Also entweder:

Code: Alles auswählen

for A, B, C in ((A,B,C) for A in alph for B in alph for C in alph...for E in alph):
    [...]
oder

Code: Alles auswählen

from itertools import combinations_with_replacement
for A, B, C in combinations_with_replacement(alpha, 3):
    [...]
Quicktrader
User
Beiträge: 16
Registriert: Freitag 6. November 2015, 20:24

Wow, danke...perfekte Antwort..werd's gleich umsetzen. Credits@sirius3.
Antworten