Antes de buscar una herramienta de "recuadro negro", que pueda usarse para ejecutar en paralelo funciones "genéricas" de Python, sugeriría analizar cómo my_function()
se puede paralelizar manualmente.
Primero, compare el tiempo de ejecución de la sobrecarga del bucle de my_function(v)
Python for
: [C] Los for
bucles de Python son bastante lentos, por lo que el tiempo invertido my_function()
podría 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 verificación si hay una implementación vectorial simple my_function(v)
que no requiere bucles:F[:] = my_vector_function(X)
(Estos dos primeros puntos son bastante triviales, perdóname si los mencioné aquí solo para completarlos).
El tercer y más importante punto, al menos para las implementaciones de CPython, es verificar si my_function
pasa la mayor parte del tiempo dentro o fuera del bloqueo global del intérprete , o GIL . Si se pasa tiempo fuera del GIL, se debe usar el threading
módulo de biblioteca estándar . ( Aquí un ejemplo). Por cierto, uno podría pensar en escribir my_function()
como una extensión C solo para liberar el GIL.
Finalmente, si my_function()
no libera el GIL, uno podría usar el multiprocessing
módulo .
Referencias: documentos de Python sobre ejecución simultánea e introducción numpy / scipy sobre procesamiento paralelo .