Python Prime Knirschen: Verarbeitung Pool ist langsamer?

8

Also habe ich die letzten paar Tage mit der Multiprocessing-Lib von Python herumgespielt und ich mag den Verarbeitungspool sehr. Es ist einfach zu implementieren und ich kann viele Anwendungen visualisieren. Ich habe ein paar Projekte, von denen ich schon gehört habe, gemacht, um mich mit dem Projekt vertraut zu machen und habe kürzlich ein Programm fertiggestellt, das brutale Spiele von Henkern beinhaltet.

Anywho, ich habe eine Ausführungszeit comparison der Summierung aller Primzahlen zwischen 1 Million und 2 Millionen sowohl Singlethread als auch durch einen Verarbeitungspool. Nun, für den Henker Cruncher, die Spiele in einen Verarbeitungspool zu bringen, verbesserte die Ausführungszeit um etwa das 8-fache (i7 mit 8 Kernen), aber wenn man diese Primzahlen ausmachte, erhöhte sich die Bearbeitungszeit tatsächlich um fast ein Faktor 4.

Kann mir jemand sagen, warum das so ist? Hier ist der Code für jeden, der daran interessiert ist, es zu betrachten oder zu testen:

%Vor%

Es wird derzeit in einem einzigen Thread ausgeführt, um den Verarbeitungspool zu durchlaufen, die Pool-Anweisungen auskommentieren und die anderen Zeilen in der for-Schleife auskommentieren.

    
Laharah 26.08.2011, 19:31
quelle

1 Antwort

14

Der effizienteste Weg, um multiprocessing zu verwenden, besteht darin, die Arbeit in n Teile gleicher Größe aufzuteilen, wobei n die Größe des Pools hat, was etwa der Anzahl der Kerne auf Ihrem System entspricht. Der Grund dafür ist, dass die Arbeit, Subprozesse zu starten und zwischen ihnen zu kommunizieren, ziemlich groß ist. Wenn die Größe der Arbeit im Vergleich zur Anzahl der Arbeitsabschnitte klein ist, wird der Overhead von IPC signifikant.

In Ihrem Fall fordern Sie Multiprocessing, um jede Primzahl einzeln zu verarbeiten. Ein besserer Weg, um mit dem Problem umzugehen, besteht darin, jedem Arbeiter einen Bereich von Werten (wahrscheinlich nur einen Anfangs- und Endwert) zu übergeben und alle Primzahlen in dem gefundenen Bereich zurückgeben zu lassen.

Im Falle der Identifizierung von groß-ischen Primzahlen wächst die Arbeit mit dem Startwert, und Sie wollen wahrscheinlich nicht den gesamten Bereich in genau n Chunks teilen, sondern n * k gleich Chunks, mit k einige vernünftige, kleine Zahl, sagen 10 - 100. auf diese Weise, wenn einige Arbeiter vor anderen beenden, gibt es mehr Arbeit zu tun und es kann effizient über alle Arbeiter ausgeglichen werden.

Bearbeiten: Hier ist ein verbessertes Beispiel, um zu zeigen, wie diese Lösung aussehen könnte. Ich habe mich so wenig wie möglich verändert, damit du Äpfel mit Äpfeln vergleichen kannst.

%Vor%     
SingleNegationElimination 26.08.2011, 20:42
quelle

Tags und Links