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:

Warum funktioniert mein Beispiel für Santiago? Was könnte der Grund sein, warum es auf meinem Computer nicht funktioniert?1?Wird in meinem Beispielcode zwischen den Prozessen kopiert? Mein Code sollte jedem Thread eine Matrix der Matrizenliste geben.Ist mein Code ein schlechtes Beispiel, weil ich benutzeNumpy?

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ß.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage