Seite 1 von 1

Memory vs. CPU

Verfasst: Samstag 16. Januar 2016, 18:52
von Quicktrader
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

Re: Memory vs. CPU

Verfasst: Samstag 16. Januar 2016, 19:27
von Sirius3
@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):
    [...]

Re: Memory vs. CPU

Verfasst: Samstag 16. Januar 2016, 19:39
von Quicktrader
Wow, danke...perfekte Antwort..werd's gleich umsetzen. Credits@sirius3.