【发布时间】:2016-04-12 09:23:06
【问题描述】:
这是我为比较 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 代码以修复循环索引/返回值错误。该错误是由于我试图在发布之前编辑狙击手中的名称以使其可呈现(每次都是一个坏主意:))。
【问题讨论】:
-
Python 版本会因为重复的属性查找而产生少量开销。您可以尝试在循环之外执行
dot = M1.dot,然后在您的定时部分执行dot(M2)。同样预存time = time.time。更一般地说,我不确定将完全相同的点积计算 6000 次是否是一个很好的基准。 -
我相信 MATLAB 也使用高效的编译代码进行向量运算。我建议计算持续时间的最小值,因为这将为您提供执行相同计算的最接近的猜测。并且 tic/toc 测量挂钟时间并存在一些问题,
timeit(已经存在于较新版本的 MATLAB 中)应该更准确。 -
假设
M1和M2是浮点数组,np.dot的性能将主要取决于在运行时链接哪个BLAS 库numpy,而不是numpy 本身。您可以从np.show_config()的输出中找到这一点。我相信 MATLAB 使用英特尔的数学内核库 (MKL)。 -
另外,您的 MATLAB 函数返回
r而不是avg_time -
我已经编辑了代码 sn-p 来修复返回变量和循环索引问题
标签: python performance matlab numpy linear-algebra