Für C ++ können wir OpenMP verwenden, um parallel zu programmieren. OpenMP funktioniert jedoch nicht für Python. Was soll ich tun, wenn ich einige Teile meines Python-Programms parallel schalten möchte?
Die Struktur des Codes kann wie folgt betrachtet werden:
solve1(A)
solve2(B)
Wo solve1
und solve2
sind zwei unabhängige Funktionen. Wie kann diese Art von Code parallel statt nacheinander ausgeführt werden, um die Laufzeit zu verkürzen? Hoffe jemand kann mir helfen. Vielen Dank im Voraus. Der Code lautet:
def solve(Q, G, n):
i = 0
tol = 10 ** -4
while i < 1000:
inneropt, partition, x = setinner(Q, G, n)
outeropt = setouter(Q, G, n)
if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol:
break
node1 = partition[0]
node2 = partition[1]
G = updateGraph(G, node1, node2)
if i == 999:
print "Maximum iteration reaches"
print inneropt
Wobei Setinner und Setouter zwei unabhängige Funktionen sind. Dort möchte ich parallel ...
python
parallel-processing
ilovecp3
quelle
quelle
Antworten:
Sie können das Multiprozessor- Modul verwenden. Für diesen Fall könnte ich einen Verarbeitungspool verwenden:
Dadurch entstehen Prozesse, die allgemeine Arbeit für Sie leisten können. Da wir nicht bestanden haben
processes
, wird ein Prozess für jeden CPU-Kern auf Ihrem Computer erzeugt. Jeder CPU-Kern kann einen Prozess gleichzeitig ausführen.Wenn Sie eine Liste einer einzelnen Funktion zuordnen möchten, gehen Sie folgendermaßen vor:
Verwenden Sie keine Threads, da die GIL alle Vorgänge für Python-Objekte sperrt.
quelle
pool.map
auch Wörterbücher als Argumente? Oder nur einfache Listen?Dies kann sehr elegant mit Ray gemacht werden .
Um Ihr Beispiel zu parallelisieren, müssen Sie Ihre Funktionen mit dem
@ray.remote
Dekorator definieren und sie dann mit aufrufen.remote
.Dies hat eine Reihe von Vorteilen gegenüber dem Multiprozessor- Modul.
Diese Funktionsaufrufe können zusammengesetzt werden, z.
Beachten Sie, dass Ray ein Framework ist, an dessen Entwicklung ich mitgewirkt habe.
quelle
pip
. Ich würde vorschlagen, es zu versuchenpip install --upgrade pip
. Wenn Sie überhaupt etwas verwenden müssen,sudo
ist es möglich, dass die Versionpip
, die Sie für die Installation verwenden,ray
nicht dieselbe ist, die aktualisiert wird. Sie können mit überprüfenpip --version
. Außerdem wird Windows derzeit nicht unterstützt. Wenn Sie also unter Windows arbeiten, ist dies wahrscheinlich das Problem.CPython verwendet die globale Interpreter-Sperre, wodurch die parallele Programmierung etwas interessanter ist als in C ++
Dieses Thema enthält einige nützliche Beispiele und Beschreibungen der Herausforderung:
Problemumgehung für Python Global Interpreter Lock (GIL) auf Multi-Core-Systemen mit Taskset unter Linux?
quelle
Die Lösung besteht, wie andere gesagt haben, darin, mehrere Prozesse zu verwenden. Welcher Rahmen besser geeignet ist, hängt jedoch von vielen Faktoren ab. Zusätzlich zu den bereits erwähnten gibt es auch charm4py und mpi4py (ich bin der Entwickler von charm4py).
Es gibt eine effizientere Möglichkeit, das obige Beispiel zu implementieren, als die Worker-Pool-Abstraktion zu verwenden. Die Hauptschleife sendet
G
in jeder der 1000 Iterationen immer wieder dieselben Parameter (einschließlich des vollständigen Diagramms ) an die Mitarbeiter. Da sich mindestens ein Mitarbeiter in einem anderen Prozess befindet, müssen die Argumente kopiert und an die anderen Prozesse gesendet werden. Dies kann je nach Größe der Objekte sehr kostspielig sein. Stattdessen ist es sinnvoll, dass Mitarbeiter den Status speichern und einfach die aktualisierten Informationen senden.In charm4py kann dies beispielsweise folgendermaßen geschehen:
Beachten Sie, dass wir für dieses Beispiel wirklich nur einen Mitarbeiter benötigen. Die Hauptschleife könnte eine der Funktionen ausführen und den Worker die andere ausführen lassen. Aber mein Code hilft, ein paar Dinge zu veranschaulichen:
result_a.get()
das Warten auf das Ergebnis blockiert ist, führt Worker A die Berechnung im selben Prozess durch.quelle
In einigen Fällen ist es möglich, Schleifen mit Numba automatisch zu parallelisieren , obwohl dies nur mit einer kleinen Teilmenge von Python funktioniert:
Leider scheint Numba nur mit Numpy-Arrays zu funktionieren, nicht jedoch mit anderen Python-Objekten. Theoretisch könnte es auch möglich sein , Python nach C ++ zu kompilieren und dann automatisch mit dem Intel C ++ - Compiler zu parallelisieren , obwohl ich dies noch nicht ausprobiert habe.
quelle
Sie können die
joblib
Bibliothek verwenden, um parallele Berechnungen und Mehrfachverarbeitungen durchzuführen.Sie können einfach eine Funktion erstellen
foo
, die parallel ausgeführt werden soll, und basierend auf dem folgenden Code die parallele Verarbeitung implementieren:Wo
num_cores
kann aus dermultiprocessing
Bibliothek wie folgt bezogen werden:Wenn Sie eine Funktion mit mehr als einem Eingabeargument haben und nur eines der Argumente durch eine Liste durchlaufen möchten, können Sie die
partial
Funktion aus derfunctools
Bibliothek wie folgt verwenden:Sie können eine vollständige Erklärung der Python und R Multiprocessing mit paar Beispiele finden sich hier .
quelle