Antes de procurar uma ferramenta "caixa preta", que pode ser usada para executar funções python "genéricas" paralelas, sugiro que analise como my_function()
pode ser paralelizado manualmente.
Primeiro, compare o tempo de execução my_function(v)
com o for
overhead do loop python : [C] Os for
loops do Python são muito lentos, portanto o tempo gasto my_function()
pode ser insignificante.
>>> 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
Segunda verificação, se houver uma implementação de vetor simples my_function(v)
que não exija loops:F[:] = my_vector_function(X)
(Esses dois primeiros pontos são bastante triviais, perdoe-me se eu os mencionei aqui apenas por completude.)
O terceiro e mais importante ponto, pelo menos para as implementações de CPython, é verificar se my_function
passa a maior parte do tempo dentro ou fora do bloqueio global de intérpretes , ou GIL . Se o tempo for gasto fora do GIL, o threading
módulo de biblioteca padrão deve ser usado. ( Aqui está um exemplo). BTW, pode-se pensar em escrevermy_function()
como uma extensão C apenas para liberar o GIL.
Finalmente, se my_function()
não liberar o GIL, pode-se usar o multiprocessing
módulo .
Referências: documentos em Python sobre execução simultânea e introdução numpy / scipy no processamento paralelo .