Bueno, esto es una especie de interesante nota si ejecuta los siguientes comandos:
import numpy
from multiprocessing import Pool
a = numpy.arange(1000000)
pool = Pool(processes = 5)
result = pool.map(numpy.sin, a)
UnpicklingError: NEWOBJ class argument has NULL tp_new
no esperaba que, por lo cuál pasando, así:
>>> help(numpy.sin)
Help on ufunc object:
sin = class ufunc(__builtin__.object)
| Functions that operate element by element on whole arrays.
|
| To see the documentation for a specific ufunc, use np.info(). For
| example, np.info(np.sin). Because ufuncs are written in C
| (for speed) and linked into Python with NumPy's ufunc facility,
| Python's help() function finds this page whenever help() is called
| on a ufunc.
numpy.sin sí está implementado en C, como tal, realmente no se puede utilizar directamente con multiprocesamiento.
así que tenemos que envolverlo con otra función
Potencia:
import time
import numpy
from multiprocessing import Pool
def numpy_sin(value):
return numpy.sin(value)
a = numpy.arange(1000000)
pool = Pool(processes = 5)
start = time.time()
result = numpy.sin(a)
end = time.time()
print 'Singled threaded %f' % (end - start)
start = time.time()
result = pool.map(numpy_sin, a)
pool.close()
pool.join()
end = time.time()
print 'Multithreaded %f' % (end - start)
$ python perf.py
Singled threaded 0.032201
Multithreaded 10.550432
wow, no esperaba que, o bien, así theres un par de temas para empezar estamos utilizando una función de Python incluso si solo se trata de un wrapper frente a una función c pura, y también existe la sobrecarga de copiar los valores, el multiprocesamiento de forma predeterminada no comparte datos, por lo tanto, cada valor debe copiarse hacia adelante o hacia atrás.
tenga en cuenta que si bien el segmento nuestros datos:
import time
import numpy
from multiprocessing import Pool
def numpy_sin(value):
return numpy.sin(value)
a = [numpy.arange(100000) for _ in xrange(10)]
pool = Pool(processes = 5)
start = time.time()
result = numpy.sin(a)
end = time.time()
print 'Singled threaded %f' % (end - start)
start = time.time()
result = pool.map(numpy_sin, a)
pool.close()
pool.join()
end = time.time()
print 'Multithreaded %f' % (end - start)
$ python perf.py
Singled threaded 0.150192
Multithreaded 0.055083
Entonces, ¿qué podemos obtener de esto, el multiprocesamiento está muy bien, pero que siempre debe comprobar y comparar que a veces es más rápido ya veces su lento, dependiendo de cómo su usado ...
Concedido que usted no está usando numpy.sin
pero otra función que le recomendaría primero verifique que de hecho multiprocesamiento acelerará el cálculo, tal vez la sobrecarga de copiar valores hacia atrás/adelante puede afectarlo.
De cualquier manera Yo también creo que el uso de pool.map
es el mejor método, más segura de código multihilo ...
espero que esto ayude.
Si va a usar 'pool.map()', debe usar 'math.sin' porque es más rápido que' numpy.sin'. Referencia: http://stackoverflow.com/questions/3650194/are-numpys-math-functions-faster-than-pythons. – EOL
Para 'numpy.sin', el [wiki oficial numpy/scipy] (http://wiki.scipy.org/ParallelProgramming) dice que debería funcionar en paralelo si [compila numpy con openmp activado] (https: // software.intel.com/en-us/articles/numpyscipy-with-intel-mkl). – ziyuang
También podría usar [Bohrium] (http://bohrium.readthedocs.io/): debería ser tan simple como reemplazar su primera línea con 'import bohrium numpy' ... – j08lue