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 foroverhead do loop python : [C] Os forloops 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_functionpassa 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 threadingmó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 multiprocessingmódulo .
Referências: documentos em Python sobre execução simultânea e introdução numpy / scipy no processamento paralelo .