Multiprocessing.Pool verlangsamt die Numpy-Matrix-Multiplikation
Also spiele ich mitmultiprocessing.Pool
undNumpy
, aber es scheint, als hätte ich einen wichtigen Punkt verpasst. Warum ist derpool
Version viel langsamer? Ich sah mich umhtop
und ich kann sehen, dass mehrere Prozesse erstellt werden, aber alle teilen sich eine der CPUs, die sich auf ~ 100% summieren.
$ cat test_multi.py
import numpy as np
from timeit import timeit
from multiprocessing import Pool
def mmul(matrix):
for i in range(100):
matrix = matrix * matrix
return matrix
if __name__ == '__main__':
matrices = []
for i in range(4):
matrices.append(np.random.random_integers(100, size=(1000, 1000)))
pool = Pool(8)
print timeit(lambda: map(mmul, matrices), number=20)
print timeit(lambda: pool.map(mmul, matrices), number=20)
$ python test_multi.py
16.0265390873
19.097837925
[aktualisieren]
gewechselt zutimeit
für Benchmarking-Prozesseinit Pool mit einigen meiner KerneBerechnung geändert, so dass es mehr Berechnung und weniger Speicherübertragung gibt (hoffe ich)Immer noch keine Veränderung.pool
Version ist noch langsamer und ich kann in sehenhtop
dass nur ein Kern verwendet wird, werden auch mehrere Prozesse erzeugt.
[update2]
Im Moment lese ich über den Vorschlag von @ Jan-Philip Gehrckemultiprocessing.Process()
undQueue
. Aber in der Zwischenzeit würde ich gerne wissen:
Numpy
?Ich habe gelernt, dass man oft bessere Antworten bekommt, wenn die anderen mein Endziel so kennen: Ich habe viele Dateien, die atm geladen und seriell verarbeitet werden. Die Verarbeitung ist CPU-intensiv, daher gehe ich davon aus, dass durch Parallelisierung viel gewonnen werden könnte. Mein Ziel ist es, die Python-Funktion aufzurufen, die eine Datei parallel analysiert. Außerdem ist diese Funktion nur eine Schnittstelle zu C-Code, was einen Unterschied macht.
1 Ubuntu 12.04, Python 2.7.3, i7 860 @ 2.80 - Bitte hinterlassen Sie einen Kommentar, wenn Sie weitere Informationen benötigen.
[update3]
Hier sind die Ergebnisse aus Stefanos Beispielcode. Aus irgendeinem Grund gibt es keine Beschleunigung. : /
testing with 16 matrices
base 4.27
1 5.07
2 4.76
4 4.71
8 4.78
16 4.79
testing with 32 matrices
base 8.82
1 10.39
2 10.58
4 10.73
8 9.46
16 9.54
testing with 64 matrices
base 17.38
1 19.34
2 19.62
4 19.59
8 19.39
16 19.34
[Update 4] Antwort aufKommentar von Jan-Philip Gehrcke
Entschuldigung, dass ich mich nicht klarer ausgedrückt habe. Wie ich in Update 2 geschrieben habe, besteht mein Hauptziel darin, viele serielle Aufrufe einer Python-Bibliotheksfunktion eines Drittanbieters zu parallelisieren. Diese Funktion ist eine Schnittstelle zu irgendeinem C-Code. Mir wurde empfohlen, zu verwendenPool
, aber das hat nicht funktioniert, also habe ich etwas einfacheres ausprobiert, das oben gezeigte Beispiel mitnumpy
. Aber auch dort konnte ich keine Leistungssteigerung erzielen, obwohl es für mich "peinlich parallelisierbar" aussieht. Ich nehme also an, ich habe etwas Wichtiges verpasst. Diese Information ist das, wonach ich mit dieser Frage und dieser Prämie suche.
[Update 5]
Vielen Dank für all Ihre großartigen Beiträge. Aber das Durchlesen Ihrer Antworten wirft für mich nur noch mehr Fragen auf. Aus diesem Grund werde ich über das lesenGrundlagen und neue SO-Fragen erstellen, wenn ich besser verstehe, was ich nicht weiß.