对于小矩阵乘法而言,对于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函数相比,建议在哪个点上循环使用较小的子数组?