Numpy.dot矩阵乘法:(n-by-m)*(m-by-k)和(m-by-k)*(k-by-n)具有非常不同的速度

时间:2015-01-04 03:03:41

标签: python performance numpy matrix-multiplication

我有以下Python代码:

import numpy
import time

A = numpy.random.random((10,60000))
B = numpy.random.random((60000,785))
C = numpy.random.random((785,10))

t = time.time()
D = A.dot(B)
print "%.2f s" % (time.time() - t)

t = time.time()
E = B.dot(C)
print "%.2f s" % (time.time() - t)

我认为两个矩阵乘法A * B和B * C应该花费大约相同的时间量,因为这两个乘法都涉及10 * 60000 * 785乘法运算。

但是,在不同的机器上我的时间差别很大。在我的笔记本电脑上(Windows 7,2.40 GHz CPU,8G内存,Python 2.7,Numpy 1.7.1),我得到了:

0.21 s
0.21 s

这是正常的。在集群机器上(Linux CentOS 5.6,2.66 GHz CPU,16G内存,Python 2.7.3,Numpy 1.8.1),我得到了:

6.77 s
1.10 s

其中A * B比B * C慢得多。

有人可以解释为什么两次乘法需要不同的时间吗? 我不确定哪些配置是相关的,但我会尝试提供所需的任何信息。

2 个答案:

答案 0 :(得分:0)

A中的元素多于C,因此结果很直观。

答案 1 :(得分:0)

(评论太长,不是答案)

如果您执行以下操作,性能会有很大差异吗?

#!/usr/bin/env python3.4                                                                 
import numpy
import time

A = numpy.random.random((10,60000))
B = numpy.random.random((60000,785))
C = numpy.random.random((785,10))

t = time.time()
D = A.dot(B)
print("%.2f s" % (time.time() - t))

t = time.time()
D = numpy.transpose(B).dot(numpy.transpose(A))
print("%.2f s" % (time.time() - t))

t = time.time()
D = B.dot(C)
print("%.2f s" % (time.time() - t))

t = time.time()
D = numpy.transpose(C).dot(numpy.transpose(B))
print("%.2f s" % (time.time() - t))

当我运行时,我获得了

0.21 s
0.22 s
0.44 s
0.22 s

这强烈表明了内存访问模式的差异。