Wie kann man riesige verschachtelte Schleifen auf 8 (oder mehr) Prozesse unter Verwendung von Python aufteilen?

8

Dieses Mal stehe ich vor einem "Design" -Problem. Mit Python habe ich einen mathematischen Algorithmus implementiert, der 5 Parameter verwendet. Um die beste Kombination dieser 5 Parameter zu finden, habe ich eine 5-schichtige verschachtelte Schleife verwendet, um alle möglichen Kombinationen in einem gegebenen Bereich aufzuzählen. Die Zeit bis zum Ende schien über meinen Erwartungen zu sein. Also denke ich, es ist die Zeit, Multithreading zu verwenden ...

Die Aufgabe im Kern von Nested Loops ist das Berechnen und Speichern. Im aktuellen Code wird das Ergebnis jeder Berechnung an eine Liste angehängt und die Liste wird am Ende des Programms in eine Datei geschrieben.

Da ich nicht zu viel Erfahrung mit Multithreading in einer beliebigen Sprache habe, ganz zu schweigen von Python, möchte ich um einige Hinweise bitten, wie die Struktur für dieses Problem aussehen sollte. Wie sollten die Berechnungen den Threads dynamisch zugewiesen werden und wie sollten die Threads Ergebnisse speichern und später alle Ergebnisse in einer Datei zusammenfassen? Ich hoffe die Anzahl der Threads kann einstellbar sein.

Jede Illustration mit Code wird sehr hilfreich sein.

vielen Dank für Ihre Zeit, ich schätze es.

#

Aktualisierung des 2. Tages: Danke für alle hilfreichen Antworten, jetzt weiß ich, dass es Multiprocessing statt Multithreading ist. Ich verwechsle mich immer mit diesen beiden Konzepten, weil ich denke, wenn es Multithread ist, wird das Betriebssystem automatisch mehrere Prozessoren verwenden, um es auszuführen, wenn es verfügbar ist. Ich werde Zeit finden, um heute Nacht mit Multiprozessing zu arbeiten.

    
Matt 04.07.2011, 22:23
quelle

3 Antworten

7

Sie können krug ausprobieren, eine Bibliothek, die ich für sehr ähnliche Probleme geschrieben habe. Ihr Code würde dann ungefähr wie

aussehen %Vor%

Jetzt können Sie so viele Prozesse ausführen, wie Sie möchten (sogar über ein Netzwerk, wenn Sie Zugriff auf einen Computer-Cluster haben).

    
luispedro 04.07.2011, 23:00
quelle
7

Multithreading in Python wird Ihnen bei dieser Art von Problem nichts bringen, da Python Threads nicht parallel ausführt (meistens werden sie für I / O-Parallelität verwendet).

Sie möchten stattdessen multiprocessing oder einen benutzerfreundlichen Wrapper wie joblib :

%Vor%

Wobei enum_combinations alle Kombinationen Ihrer fünf Parameter aufzählen würde; Sie können es wahrscheinlich implementieren, indem Sie am unteren Ende der verschachtelten Schleife ein yield einfügen.

joblib verteilt die Kombinationen über mehrere Worker-Prozesse und kümmert sich um einen Lastausgleich.

    
Fred Foo 04.07.2011 22:32
quelle
3

Angenommen, dies ist ein rechenintensives Problem (und damit CPU-gebunden), wird Multi-Threading in Python aufgrund der GIL nicht viel helfen.

Sie können jedoch die Berechnung auf mehrere Prozesse aufteilen, um zusätzliche CPU-Kerne zu nutzen. Der einfachste Weg dazu ist die multiprocessing Bibliothek.

Es gibt eine Reihe von Beispielen dafür, wie Sie multiprocessing auf der Dokumentseite dafür verwenden können.

    
Amber 04.07.2011 22:29
quelle

Tags und Links