代码如下,
In [180]: rng = np.random.RandomState(123)
In [181]: A1 = rng.uniform(size=(10000,80))
In [182]: B1 = rng.uniform(size=(10000,30))
In [183]: A2 = rng.uniform(size=(80,10000))
In [184]: B2 = rng.uniform(size=(30,10000))
In [185]: %timeit np.dot(A1.T, B1)
10 loops, best of 3: 136 ms per loop
In [186]: %timeit np.dot(A2, B2.T)
10 loops, best of 3: 25.1 ms per loop
In [4]: %timeit np.dot(A2, B1)
10 loops, best of 3: 56.3 ms per loop
我希望将(A1, B1)
和(A2, B2)
相乘以形成(80,30)
矩阵,这里的区别在于A1
被定义为A2
的转置, 10000
中的A1
行,但80
中的A2
行。与B1,B2
相同。
性能完全不同,我想这是因为numpy.array
的内存布局更强缓存友好 大列比更大行,对吗?但是如何?
答案 0 :(得分:0)
MCM是一种算法,它可以计算出乘以一组矩阵的最有效方法,值得研究以了解矩阵乘法的更多信息。通常,矩阵乘法不是可交换的,并且根据顺序,您可以获得完全不同的运行时间进行计算。