Прежде чем искать инструмент «черного ящика», который можно использовать для параллельного выполнения «общих» функций Python, я бы предложил проанализировать, как my_function()
можно распараллеливать вручную.
Во-первых, сравните время выполнения my_function(v)
с for
накладными расходами цикла Python : [C] for
Циклы Python довольно медленные, поэтому затраченное время my_function()
может быть незначительным.
>>> 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
Вторая проверка, если есть простая векторная реализация my_function(v)
, которая не требует циклов:F[:] = my_vector_function(X)
(Эти два первых пункта довольно тривиальны, простите, если я упомянул их здесь только для полноты.)
В- третьих , и самое главное, по крайней мере , для реализации CPython, чтобы проверить , является ли my_function
проводит большую часть времени , это внутри или снаружи от глобальной блокировки интерпретатора или GIL . Если время проводится за пределами GIL, то следует использовать threading
стандартный библиотечный модуль . ( Вот пример). Кстати, можно было бы написать my_function()
как расширение C просто для выпуска GIL.
Наконец, если my_function()
не выпустить GIL, можно использовать multiprocessing
модуль .
Ссылки: документы Python по параллельному выполнению и введение numpy / scipy при параллельной обработке .