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 for
loop 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_function
trascorre 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 multiprocessing
modulo .
Riferimenti: documenti Python su Esecuzione simultanea e introduzione numpy / scipy sull'elaborazione parallela .