我得到了一些我无法解释的效率测试结果.
我想组装一个矩阵B,其第i个条目B [i,:,:] = A [i,:,:].dot(x),其中每个A [i,:,:]是一个2D矩阵, x也是如此.
我可以这三种方式来测试性能我做的随机(numpy.random.randn
)矩阵A =(10,1000,1000),x =(1000,1200).我得到以下时间结果:
(1)单个多维点积
B = A.dot(x)
total time: 102.361 s
Run Code Online (Sandbox Code Playgroud)
(2)循环通过i并执行2D点积
# initialize B = np.zeros([dim1, dim2, dim3])
for i in range(A.shape[0]):
B[i,:,:] = A[i,:,:].dot(x)
total time: 0.826 s
Run Code Online (Sandbox Code Playgroud)
(3)numpy.einsum
B3 = np.einsum("ijk, kl -> ijl", A, x)
total time: 8.289 s
Run Code Online (Sandbox Code Playgroud)
因此,选项(2)是迄今为止最快的.但是,仅考虑(1)和(2),我看不出它们之间的巨大差异.如何循环和做2D点产品的速度要快124倍?他们都使用numpy.dot.任何见解?
我在下面包含了用于上述结果的代码:
import numpy as np
import numpy.random as npr
import time
dim1, dim2, dim3 = 10, 1000, 1200
A = npr.randn(dim1, dim2, dim2)
x = npr.randn(dim2, …
Run Code Online (Sandbox Code Playgroud)