2017-02-28 4 views
0

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.

+0

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

+0

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

+0

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

Antwort

1

Hier ist eine schnelle und schmutzige Einfügung, die Sie verwenden könnten. Anstatt einer Funktion könnten Sie diesen Code inline einfügen, um den Funktionsaufruf-Overhead zu vermeiden.

def top_insert(my_list, item, keep_only = 10): 
    rev = item[0] 
    newlist = [ i for i in my_list if i[0] > rev] 
    if len(newlist) >= keep_only: 
     return newlist[:keep_only] 
    elif len(newlist) == (keep_only - 1): 
     return newlist + [item] 
    else: 
     return newlist + [item] + my_list[len(newlist):keep_only-len(newlist)-1] 
+0

Basiert auf der Änderung, Das ist wahrscheinlich nicht die Lösung. Das Sortieren von 50 Dingen wäre kein großer Leistungshit. – RobertB

+0

Ich denke, das Problem ist, dass jedes dieser Elemente, die es sortiert, eine Tonne von Informationen enthält/eine Tonne Speicher verwendet. Siehe meine andere Frage hier: http://stackoverflow.com/questions/42517635/python-query-over-list-of-tuples/42518373#42518373 Sobald ich eine sortierte einfügen, hielt es die Anzahl der Elemente, die ich war wegspeichern – keynesiancross

Verwandte Themen