python - 在 python 和 matlab 中填充矩阵的速度

标签 python performance matlab python-2.7 numpy

我正在测试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 更快?或者我在这里做错了什么?

感谢您的帮助。

最佳答案

我希望您知道您应该使用这两种语言编写矢量化代码!

  1. 我相信 Matlab 有一个即时加速器,它可能会启动这样的表达式,我不确定如果您在内部循环中调用自己的函数会发生什么。
  2. 循环本身并不是一切,大多数时候最内层循环的内容更重要。因此,嵌套循环更快还是更慢的整个问题可能通常是错误的问题。
  3. 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/

相关文章:

linux - 从命令行 Linux 将字符串传递给 matlab

python - 如何在 pandas 系列列表上使用 OneHotEncoder?

Python 刷新 HTML 文档

python - 无法使用 cx-Oracle 插入 Unicode

python - 分发具有 Julia 依赖项的独立 Python 软件

java - 如何使JVM启动更快? [复制]

c# - 7 秒 EF 启动时间,即使对于微小的 DbContext

java - 带开关的循环与不同的循环

oop - Matlab 面向对象的组合、聚合

c# - 作为 C# 安装程序向导的一部分安装 Matlab MCR