与for循环相比,多维Numpy dot产品较慢

时间:2016-12-09 19:49:43

标签: python arrays numpy matrix

对于小矩阵乘法而言,对于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循环每个循环

看着

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函数相比,建议在哪个点上循环使用较小的子数组?

0 个答案:

没有答案