Prima di cercare uno strumento "scatola nera", che può essere utilizzato per eseguire in parallelo funzioni "generiche" di Python, suggerirei di analizzare come my_function()parallelizzare a mano.
Innanzitutto, confronta i tempi di esecuzione dell'overhead del loop my_function(v)python for: [C] I forloop Python sono piuttosto lenti, quindi il tempo trascorso my_function()potrebbe essere trascurabile.
>>> 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
Secondo controllo se esiste una semplice implementazione vettoriale my_function(v)che non richiede loop:F[:] = my_vector_function(X)
(Questi due primi punti sono piuttosto banali, perdonami se li ho menzionati qui solo per completezza.)
Il terzo e più importante punto, almeno per le implementazioni di CPython, è verificare se my_functiontrascorre la maggior parte del tempo all'interno o all'esterno del blocco dell'interprete globale o GIL . Se il tempo è trascorso al di fuori di GIL, threadingè necessario utilizzare il modulo di libreria standard . ( Ecco un esempio). A proposito, si potrebbe pensare di scrivere my_function()come un'estensione C solo per rilasciare il GIL.
Infine, se my_function()non rilascia il GIL, si potrebbe usare il multiprocessingmodulo .
Riferimenti: documenti Python su Esecuzione simultanea e introduzione numpy / scipy sull'elaborazione parallela .