如何以某种并行的方式有效地计算两个数组列表的外积?

时间:2017-12-16 15:52:55

标签: python arrays loops numpy parallel-processing

我有两个向量列表。

A = np.random.rand(100,2000)
B = np.random.rand(100,1000)

我需要用B的第一个条目计算A的第一个条目的外积。然后是第二个,然后是第三个,依此类推。

一个天真的循环

outers = []
for a, b in zip(A,B):
    outers.append(np.outer(a,b))

在我的电脑上需要≈730[ms](通过&&timeit)。

最后outers是一个100条长的2000x1000数组列表,这是正确的。

必须有一种更有效的方法来并行执行此任务,因为现在我们实际上首先使用A[0]和THEN B[0]计算A[1] B[1],我们可以独立并行地完成这些任务。< / p>

1 个答案:

答案 0 :(得分:0)

如果您想并行执行NumPy数组操作,Dask是一个很好的选择。例如,您可以按如下方式执行此操作:

import dask.array as da
dA = da.from_array(A, chunks=(10, A.shape[1]))
dB = da.from_array(B, chunks=(10, B.shape[1]))

task_graph = dA[:, :, None] * dB[:, None]

result = task_graph.compute()

compute()步骤足够灵活,可以在多个线程,多个进程,多个核心,多台机器等上应用计算。

对于你问题中的特定示例,你不会在串行方法上获得太多收益,因为与简单地做100的成本相比,分块输入数组和连接输出数组所涉及的开销很大。外部产品。但是,对于较大的问题,这种方法可以带来显着的加速。