[英]What could be wrong with this matrix multiplication benchmark (Matlab vs Numpy)?
这是我编写的用于比较numpy和Matlab性能的代码。 它只是测量矩阵乘法(1701x576矩阵M1 * 576x576矩阵M2)所花费的平均时间。
Matlab版本 :(M1为(1701x576),而M2为(576x576)矩阵)
function r = benchmark(M1,M2)
total_time=0;
for i=1:4
for j=1:1500
tic;
a=M1*M2;
tim=toc;
total_time =total_time+tim;
end
end
avg_time = total_time/4
r=avg_time
end
Python版本 :
def benchmark():
iters = range(1500)
for i in range(4):
for j in iters:
tic = time.time()
a=M1.dot(M2);
toc = time.time() - tic
t_time=t_time+toc;
return t_time/4
Matlab版本大约需要18.2s ,而Python需要大约19.3s。 我已经多次重复了该测试,并且在所有情况下Matlab的性能始终优于Python(即使差异较小)。 我的理解是Numpy使用有效的编译代码进行矢量运算,并且应该比Matlab更快。
那么,为什么Matlab的性能要比Numpy更快? 该测试是在32核计算机上完成的。 我哪里做错了 ? 或者这对于Numpy来说要比Matlab慢。
有什么方法可以提高Python的性能吗?
编辑:更新了matlab代码以修复循环索引/返回值错误。 该错误是由于我尝试在发布程序中编辑快照程序中的名称以使其可显示而造成的(每次都不好的主意:))。
[编辑以删除循环的提及; 那是我的错误]
夫妻的事
首先,机器的多核本质并不重要,除非您明确使用了这些额外的核(或将NumPy链接到使用多个核的BLAS库-感谢@ali_m)。 如果不是这样,它在32核计算机上的运行速度将与在4核计算机上的运行速度差不多(假设内核本身的时钟速度大致相等)。
其次,使用纯现成的Matlab与现成的NumPy, Matlab通常会击败NumPy 。 但是,这是一个非常笼统的陈述。 因人而异。 此外,谈到Matlab,循环索引中确实确实存在错误。
第三,这可能不是最佳的性能基准; 可能会发生一些看不见的缓存问题,这些问题并不明显。 更好的方法是在每次迭代过程中即时动态生成矩阵并将它们相乘,但是根据随机数生成器的不同,即使这样也会有问题。
Matlab代码中有错误。 看来您在嵌套循环中使用了相同的循环控制变量。
外循环实际上只运行一次。
编辑:外循环实际上运行正确的次数。 这两个循环控制变量似乎是独立的。
我可以在测试中看到两个主要问题。
第一个是您在Python中使用全局变量查找,而在MATLAB中使用局部变量查找。 Python中的全局变量查找相对较慢。 确保变量像在MATLAB中一样是局部变量会影响性能。
第二个是您要一遍又一遍地进行相同的计算。 MATLAB有一个用于循环的JIT,而numpy有一个用于计算的缓存,这两者都可以减少重复计算的时间。
因此,为使比较更加平等和可靠,您应该在循环中每次创建新的随机矩阵。 这将防止缓存和JIT弄乱您的结果,并确保变量均为本地变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.