我有以下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慢得多。
有人可以解释为什么两次乘法需要不同的时间吗? 我不确定哪些配置是相关的,但我会尝试提供所需的任何信息。
答案 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
这强烈表明了内存访问模式的差异。