2016-05-07 15 views
1

Um meinen Code zu verbessern, der eine schwere Schleife hat, brauche ich eine Beschleunigung. Wie kann ich Multiprozessing für einen Code wie diesen implementieren? (A ist typisch der Größe 2 und l bis 10)Multiprocessing verschachtelte Python Loops

for x1 in range(a**l): 
    for x2 in range(a**l): 
     for x3 in range(a**l): 
      output[x1,x2,x3] = HeavyComputationThatIsThreadSafe1(x1,x2,x3) 
+0

ShadowRangers Kommentar zu [Ihre andere Frage] (http://Stackoverflow.com/q/37081288/1461210) steht immer noch - alle Threads in der Welt werden nicht viel von einer Delle machen, wenn Sie sich verpflichtet fühlen Aufruf von 'HeavyComputationThatIsThreadSafe1' * über eine Milliarde *. Wie viele Sekunden dauert ein einzelner Aufruf von 'HeavyComputationThatIsThreadSafe1'? Nimm diese Zahl, multipliziere sie mit 1073741824 und dividiere durch die Anzahl der Kerne, die du hast. Das gibt Ihnen die absolute Best-Case-Szenario-Laufzeit, die Sie mit Multiprocessing erreichen können. –

+0

Ich habe die Performance-Probleme mit dem 'HeavyComputationThatiIsThreadSafe' in [der ursprünglichen Frage] (http://stackoverflow.com/a/37100607/392949) adressiert, mit dem Sie verlinkt sind. Selbst mit der von Ihnen genannten Datengröße benötigen Sie nur ~ 8 GB Speicher und 45 Sekunden, um alle drei verschachtelten Schleifen zu durchlaufen, wenn Sie einige sinnvolle Optimierungssätze verwenden. – JoshAdel

Antwort

2

Wenn die HeavyComputationThatIsThreadSafe1 Funktion verwendet nur Arrays und nicht Python-Objekte, Ich möchte einen concurrent futures (oder die python2 backport) ThreadPoolExecutor zusammen mit Numba (oder cython) mit der GIL veröffentlicht. Ansonsten verwenden Sie eine ProcessPoolExecutor.

Siehe:

http://numba.pydata.org/numba-doc/latest/user/examples.html#multi-threading

Sie würden die Berechnung auf der Ebene der äußersten Schleife parallelisieren wollen und dann output aus den Stücken von jedem Thread/Prozess resultierenden füllen. Dies setzt voraus, dass die Kosten dafür viel billiger sind als die Berechnung, was der Fall sein sollte.