Zanim zacznę szukać narzędzia „czarnej skrzynki”, którego można używać do równoległego wykonywania „ogólnych” funkcji pytona, sugeruję przeanalizować, w jaki sposób my_function()
można go sparaliżować ręcznie.
Najpierw porównaj czas wykonania narzutu my_function(v)
do for
pętli Pythona : [C] for
Pętle Pythona są dość wolne, więc czas spędzony w nich my_function()
może być znikomy.
>>> 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
Drugie sprawdzenie, czy istnieje prosta implementacja wektorowa my_function(v)
, która nie wymaga pętli:F[:] = my_vector_function(X)
(Te dwa pierwsze punkty są dość trywialne, wybacz mi, jeśli wspomniałem je tutaj tylko dla kompletności.)
Po trzecie i najważniejsze, przynajmniej dla wdrożeń CPython, jest sprawdzenie, czy my_function
spędza większość nadszedł czas, wewnątrz lub na zewnątrz w Global Interpreter Lock lub GIL . Jeśli czas spędza się poza GIL, należy użyć threading
standardowego modułu bibliotecznego . ( Oto przykład). BTW, można by pomyśleć o pisaniu my_function()
jako rozszerzenie C tylko po to, aby wydać GIL.
Wreszcie, jeśli my_function()
nie wyda GIL, można użyć multiprocessing
modułu .
Odnośniki: Dokumenty Pythona dotyczące jednoczesnego wykonywania i wprowadzenie numpy / scipy do przetwarzania równoległego .