Ich habe kürzlich einen genetischen Algorithmus fertig geschrieben. Der Algorithmus erstellt eine Liste von 50 Testfällen und führt diese durch eine Simulation aus und speichert das Ergebnis. Ich verwende eine Anzahl von benutzerdefinierten Klassen und die gespeicherten Ergebnisse enthalten Listen von Klasseninstanzen.Python - Optimierung der Speicherauslastung, genetischer Algorithmus
Wenn ich diese Simulation durchführe, dauert es nicht nur ewig, sondern auch bis zu 90 +%. Es muss irgendwo in meinem Code sein, dass nur die Speicherkapazität in Anspruch nimmt, aber ich bin nicht sicher, wie ich es finden soll. Hier ist der wichtigste Teil meines Codes, wobei die Schleifen innerhalb innerhalb von Schleifen Schleifen .....
# ----------------------------------------------------------------------------------------------------
for i in range(1,numberOfRunsToSolve,1): # begin genetic algo loop
temp = trial_cases
for ii, stored_trial in enumerate(temp): # run through stored trial cases
new_trials = []
for jj in range(1,numberOfTrialsPerRound):
tc = []
tc = randomTrials_GenAlgo_ARRAY(stored_trial, True) # create new trial set, based on indexed stored results
new_trials.append(tc)
print(new_trials)
for j, trial in enumerate(new_trials):
x = OneGenerationSimulation(trial) #returns [ObjArray, ErrorArray]
rev = revenueAndLoss(x[0])
DEBUG_ARRAY.append(str(revenue)+' trial: ' + str(trial))
results.append((revenue, trial, x[0],x[1]))
results.sort(reverse=True) # sort to bring best revenue to top
results = results[0:numberOfResultsToKeepPerRound-1]
trial_cases = []
for i, r in enumerate(results):
trial_cases.append(r[1])
# end of the genetic algo loop
# ----------------------------------------------------------------------------------------------------
Irgendwelche Vorschläge, wie die Speichernutzung in meinem Skript zu verfolgen und Täter jagen? Ich bin ziemlich neu in Python, also kannst du das Offensichtliche sagen.
BEARBEITEN: Der oben beschriebene Prozess führt im Wesentlichen Folgendes durch: 1) Erstellen Sie 50 Testläufe.
2) Führen Sie bei jedem Versuch eine Simulation durch. Diese Simulation erstellt Hunderte von benutzerdefinierten Objekten und führt ein Skript auf ihnen aus und gibt die Ergebnisse zurück. 3) Mit allen Ergebnissen, die zurückkommen, die besten 5 Ergebnisse abrufen. 4) Erstellen Sie mit diesen 5 Ergebnissen neue Testsets, und wiederholen Sie den Vorgang erneut.
Ich bin besorgt, dass die Massenobjektinstanzerstellung, die dann zu den besten 5 Ergebnissen gefiltert wird, nicht richtig im Speicher oder etwas aufgeräumt wird ... und dass alle diese Objekte in der versteckt sind Hintergrund ....
Danke - KC.
ersten Platz würde ich suchen ist Rekursion, aber wenn ich richtig verstehe, dann haben Sie bereits herausgefunden, dass diese Schleifen definitiv das Problem sind; ist das richtig? – ScegfOd
ja - definitiv. Das benutzerdefinierte Objekt Zeug möglicherweise nicht die effizienteste - aber es gibt nicht viel Code neben dem, was Sie oben sehen (ich mache das in Juypter fwiw) – keynesiancross
Eine Sache, die ich versuchen würde, ist zu sehen, ob diese riesigen Arrays von Arrays verursachen Probleme, indem sie kleinere Zahlen ausprobieren (für 'numberOfTrialsPerRound' und' numberOfRunsToSolve') und sehen, ob das große Auswirkungen hat. Ich habe noch nichts offensichtlich verschwenderisch gesehen ... – ScegfOd