我有以下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 慢得多。
有人能解释一下为什么这两个乘法需要不同的时间吗?我不确定哪些配置是相关的,但我会尽可能提供必要的信息。
numpy.transpose(B).dot(numpy.transpose(A))
比B*C
慢很多吗?如果不是,我怀疑这是一个内存布局问题。 - user14717numpy.show_config()
的输出进行比较。 - Joe Kington