Перш ніж шукати інструмент "чорний ящик", який можна використовувати для паралельного виконання "загальних" функцій пітона, я б запропонував проаналізувати, як my_function()
можна паралелізувати вручну.
По-перше, порівняйте час виконання з накладними петлями my_function(v)
python for
: [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 при паралельній обробці .