Bevor ich nach einem "Black-Box" -Tool suche, mit dem parallele "generische" Python-Funktionen ausgeführt werden können, sollte analysiert werden, wie my_function()
die Parallelisierung von Hand erfolgen kann.
Vergleichen Sie zuerst die Ausführungszeit mit my_function(v)
dem for
Overhead von Python- Schleifen: [C] Python- for
Schleifen sind ziemlich langsam, sodass der Zeitaufwand my_function()
vernachlässigbar sein kann.
>>> timeit.timeit('pass', number=1000000)
0.01692986488342285
>>> timeit.timeit('for i in range(10): pass', number=1000000)
0.47521495819091797
>>> timeit.timeit('for i in xrange(10): pass', number=1000000)
0.42337894439697266
Zweite Prüfung, ob es eine einfache Vektorimplementierung gibt my_function(v)
, die keine Schleifen erfordert:F[:] = my_vector_function(X)
(Diese beiden ersten Punkte sind ziemlich trivial, verzeihen Sie mir, wenn ich sie hier nur der Vollständigkeit halber erwähnte.)
Der dritte und wichtigste Punkt ist, zumindest für CPython-Implementierungen, zu prüfen, ob die my_function
meiste Zeit innerhalb oder außerhalb der globalen Interpretersperre oder GIL verbracht wird . Wenn Zeit außerhalb der GIL verbracht wird, sollte das threading
Standardbibliotheksmodul verwendet werden. ( Hier ein Beispiel). Übrigens könnte man sich das Schreiben my_function()
als C-Erweiterung vorstellen, nur um die GIL zu veröffentlichen.
Wenn my_function()
die GIL nicht freigegeben wird, kann das multiprocessing
Modul verwendet werden .
Referenzen: Python-Dokumentation zur gleichzeitigen Ausführung und Numpy / Scipy-Einführung zur parallelen Verarbeitung .