Python Numpy:使用池对矩阵乘法进行多处理

Python Numpy:使用池对矩阵乘法进行多处理,python,numpy,pool,Python,Numpy,Pool,我想用pool计算一个点积 pool = Pool(8) x = np.array([2,3,1,0]) y = np.array([1,3,1,0]) print np.dot(x,y) #works print pool.map(np.dot,x,y) #error below ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 也试

我想用pool计算一个点积

pool = Pool(8)
x = np.array([2,3,1,0])
y = np.array([1,3,1,0])
print np.dot(x,y) #works
print pool.map(np.dot,x,y) #error below

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
也试过

ne.evaluate('dot(x, y)') 


TypeError: 'VariableNode' object is not callable

不幸的是,你想做的事情在你想做的事情中是不可能的,在一个简单的方式中也是不可能的

更糟糕的是,Python 2.7的multiprocessing.pool文档是完全错误的,本质上是针对
pool.map
:它根本不等同于内置的
map
。内置的
map
可以使用多个参数迭代器传递给函数,而
Pool.map
不能。。。这是已知的,此后未在
Pool.map
的docstring中修复或记录。当然,在Python3中,有一个部分修复了starmap

不过,老实说,多处理模块在加速数字代码方面并没有太大用处。例如,对于许多numpy操作在通过多处理完成时速度较慢的情况进行了长时间的讨论

然而,这里还有另一个问题:不能像这样简单地并行化<代码>映射获取参数列表/迭代器,并依次对每个参数应用函数。这并不能满足您的需要:在本例中,请尝试
map(np.dot,x,y)
,注意您得到的只是x和y的每个元素作为列表的乘积,而不是点积。并行多次运行函数很容易。在单个调用中使该函数并行是困难的,因为它需要使函数本身并行。在这种情况下,这通常意味着重写函数

除了np.dot实际上已经并行化了,如果您有一个带有blas或atlas的numpy版本(请尝试
np.\uu config\uuu.show()
)。在这种情况下,您实际上根本不需要做任何工作:
np.dot(x,y)
应该已经在不做任何工作的情况下使用了所有内核

但是,我应该注意,这仅限于某些
d类型
;浮动通常是最受支持的。例如,在我的电脑上,可以看到
float
int
之间的显著差异:

In [19]: a = np.matrix(np.random.randint(0,10,size=(1000,1000)),dtype='int')

In [20]: b = a.astype('float')

In [23]: %timeit np.dot(a,a)
1 loops, best of 3: 6.91 s per loop

In [24]: %timeit np.dot(b,b)
10 loops, best of 3: 28.1 ms per loop
对于numexpr(在提问时,向那些可能不知道的人指出您使用的缩写很有用),支持的函数集非常有限;查看文档中的列表。您得到的错误是因为
dot
不是受支持的函数。由于您处理的是1D数组,而dot的定义非常简单,因此以下操作将起作用:
ne.evaluate('sum(x*y)
。但是,我怀疑您是否计划只使用1D阵列


如果你真的想大规模地并行化,我建议你使用IPython,它与Python的多处理不同,对于数值计算是非常有用的。作为额外的好处,它还可以跨计算机并行。然而,这种并行化通常只对每次运行需要一段时间的事情有用;如果您只想将所有内核用于简单的事情,那么最好希望numpy对您想要使用的函数具有多处理器支持

谢谢,起初我认为numpy应该负责并行性,但它非常慢,我有疑问。当我在空闲状态下运行代码,并用htop检查CPU使用情况时,我看到只有一个内核达到了100%,其他的保持在1%。np.\uuu config\uuuuu.show())blas\u info:libraries=['blas']library\u dirs=['/usr/lib']language=f77 lapack\u info:libraries=['lapack']library\u dirs=['/usr/lib']language=f77 atlas\u threads\u info:不可用请查看我刚才所做的编辑:如果你像上面那样使用int,那可能是你的问题。