我正在测试Python与Matlab的速度比较。我决定转向Python,因为它有很多优点,但我想比较速度,看看在这方面有什么区别。
我测试了一些 for 循环来填充 1000 x 1000 矩阵,如下所示:
from numpy import *
sizeM = 1000
y = zeros((sizeM,sizeM))
x = 4
tic = time.clock()
for i in range(sizeM):
for j in range(sizeM):
y[i,j] = cos(i*j) + i * sin(x**2);
toc = time.clock()
time = toc-tic
这样时间
就是5.93秒。但在 Matlab 中,使用以下代码只需要 0.11 秒:
tic
sizeM = 1000;
y = zeros(sizeM);
x =4;
for i = 1:sizeM
for j = 1:sizeM
y(i,j) = cos(i*j) + i * sin(x^2);
end
end
toc
我的问题是:
这是正确的吗?
Matlab 在执行嵌套 for 循环时是否比 Python 更快?或者我在这里做错了什么?
感谢您的帮助。
最佳答案
我希望您知道您应该使用这两种语言编写矢量化代码!
- 我相信 Matlab 有一个即时加速器,它可能会启动这样的表达式,我不确定如果您在内部循环中调用自己的函数会发生什么。
- 循环本身并不是一切,大多数时候最内层循环的内容更重要。因此,嵌套循环更快还是更慢的整个问题可能通常是错误的问题。
- NumPy 是为处理数组而编写的。给它这样的标量会增加很多开销,如果你真的想使用浮点标量(你不应该,因为你可以向量化操作),你不妨使用 math.sin ......
无论如何,比较一下矢量化代码:
i, j = np.ogrid[:1000,:1000] # or whatever else you want to use
y = np.cos(i * j) + i * np.sin(x**2)
也许您可以进一步优化,但这并不重要。
既然讨论似乎可以从这里开始,我不确定标量的 matlab 开销是多少,可能非常小(对于成功的 JIT 来说肯定是这样),但这意味着解释为什么这个代码片段对于 numpy 来说会很慢。请不要进行语言比较...
可以肯定地说,特别是当 JIT 在 matlab 中启动时,有必要在 NumPy 中更加努力地矢量化(或移植到编译语言,这两种语言都适用)速度敏感代码。
关于python - 在 python 和 matlab 中填充矩阵的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20348931/