对于小矩阵乘法而言,对于mkl优化的numpy似乎非常快,对于更高维的张量收缩来说它是非常慢的 . 例如,使用诸如einsum之类的函数比循环通过高维复数张量的二维子矩阵要慢得多:
complexarray = np.random.rand(2867, 100, 40) + 1j*np.random.rand(2867, 100, 40)
complexarray_cc = complexarray.conj()
%timeit np.einsum('ijk, ijm -> jkm', complexarray_cc, complexarray)
1个循环,最佳3:每循环2.45秒
%%timeit
tmp_product = np.zeros((100,40,40), dtype=complex)
for l in range(100):
tmp_product[l,:,:] = np.dot((complexarray_cc[:,l,:].T), complexarray[:,l,:])
10个循环,最佳3:120 ms每个循环
看着
How to get faster code than numpy.dot for matrix multiplication?
和
Why is B = numpy.dot(A,x) so much slower looping through doing B[i,:,:] = numpy.dot(A[i,:,:],x) )?
它描述了一个类似的问题,似乎数组太大而无法适应内存,因此使用了一些慢速矩阵乘法例程 . 这可能是这种情况吗?
天真地,我的方法是通过向量化的numpy /数组操作替换我的代码中的任何for循环 . 随着阵列变大,这似乎不是任意可扩展的 .
是否没有其他选项来增加np.dot和类似操作的操作?或者重新说明:与在非常大的数组上使用numpy函数相比,建议在哪个点上循环使用较小的子数组?