嗯,这是一种有趣的注意,如果你运行下面的命令:
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
没想到的是,有啥继续,以及:
>>> 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.
yep numpy.sin在c中实现,因此您不能直接在多处理中使用它。
,所以我们有另一个函数把它包起来
PERF:
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
哇,没想到,要么,我们甚至使用python的功能以及那里有对于初学者几个问题如果它只是一个包装器与一个纯c函数,并且也是复制值的开销,那么默认情况下多处理器不会共享数据,因为每个值都需要前后复制。
也指出,如果得到适当的细分我们的数据:
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
那么,我们能从这个取,多是伟大的,但我们应该始终测试,有时比较一下它的速度更快,有时它更慢,取决于如何其使用...
授予您没有使用numpy.sin
但另一个函数我建议您首先验证确实多处理会加快计算速度,也许前后复制值的开销可能会影响到您。
无论哪种方式,我还认为,使用pool.map
是多线程代码是最好的,最安全的方法...
我希望这有助于。
如果你打算使用'pool.map()',你应该使用'math.sin',因为它比'numpy.sin'更快。参考:http://stackoverflow.com/questions/3650194/are-numpys-math-functions-faster-than-pythons。 – EOL 2014-01-06 19:53:29
对于'numpy.sin',[官方numpy/scipy wiki](http://wiki.scipy.org/ParallelProgramming)表示,如果你[用openmp编译numpy开启]它应该并行工作(https:// software.intel.com/en-us/articles/numpyscipy-with-intel-mkl)。 – ziyuang 2015-02-18 14:31:29
你也可以使用[Bohrium](http://bohrium.readthedocs.io/):它应该像用'import bohrium as numpy'替换你的第一行一样简单...... – j08lue 2016-05-04 09:33:22