大家,我正在尝试进行以下计算。
我有一个 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,这个计算很慢,我正在尝试使用 multiprocessing.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() 已经来回腌制和解封,导致巨大的开销。
我猜对了吗?有没有更好的方法来做到这一点?
提前致谢。