我有一个2D n * d numpy数组A,它的每一行都是一个d维数据点x。我想计算一个* n矩阵B,它的每个元素B [i,j] = f(A [i],A [j]),其中f(p,q)是一个对称函数适用于每个可能的对但是,对于datap0ints,它有一些非线性操作,并且不能轻易地进行矢量化。
由于n和d可能非常大,n~200000,d~1000,这个计算速度很慢,我试图用多处理加速它.Pool()
这是我到目前为止的代码,为了简单起见,我故意忽略对称属性(B [i,j] == B [j,i])。
p = Pool(cpu_count())
for i, x in enumerate(A):
B[i] = p.map(functools.partial(f , x) , A)
我正在修复f()的一个参数作为A的一个元素,并将map()=应用于可迭代的nparray A,这样我就可以一次获得一行的答案。
这个问题就是速度,当我用(n,d)=(1000,100)尝试它时,它比我原来的元素计算更慢。
在阅读了许多其他相关帖子后,我想这是因为函数f()被来回腌制和取消,导致巨大的开销。
我猜对了吗?有没有更好的方法呢?
提前致谢。