【问题标题】:Why Matlab matrix inversion is faster than numpy?为什么 Matlab 矩阵求逆比 numpy 快?
【发布时间】:2017-06-07 05:08:45
【问题描述】:

这与讨论 numpy 与 Matlab 的速度的几个问题有关。然而,它们中的大多数具有多个矩阵运算而不是单个运算。例如。 Difference on performance between numpy and matlab

对我来说,numpy 反转随机矩阵所花费的时间大约比 matlab 慢 5 倍。

这是matlab脚本,

N = 1000;

B = randn(N,N);
h = tic;
T = 40;
for i=1:40

    Rinv = (B)^(-1);
end
toc(h)/40

这给出了大约 0.08 秒的平均值。

虽然这个 python 脚本给出了 0.4 秒(大约)。

import numpy as np 
from numpy import linalg as LA
import time 

N=1000
R = np.random.random((N,N))
T=40

t1 = time.clock()
for i in range(0,T):
    Rinv = LA.inv(R)
t2 = time.clock()
print 'avg time for inverse ',(t2-t1)/T

有什么理由这样做,或者无论如何要提高 python 性能? 我已经在 Python 上实现了我的工作,我担心是否 我将不得不将我的所有代码移植到matlab。 我正在开发 Ubuntu 16.04、Python 2.7、Matlab R2016b。

我读到time 不是一个用于执行时间比较的好模块,我觉得这不止于此。

【问题讨论】:

  • 我自己也会选择 40 个随机矩阵而不是一个。
  • 您应该使用timeit 在 MATLAB 中获得可靠的基准。取同一个变量的倒数并将其存储在循环内的同一个变量中几乎不能很好地估计执行时间,尤其是考虑到 JIT 加速
  • 这是一个相当差的基准 - 在这两种情况下,您都应该从计时中删除循环,并使用更可靠的计时机制。
  • @JamesKPolk 我认为因为两种方法生成随机数是不同的。仅比较反转时间可能不公平。无论如何都会检查的。
  • @Suever 谢谢。我正在尝试使用我没有使用过的 timeit 模块来获得结果。

标签: python matlab performance numpy matrix


【解决方案1】:

在我的电脑上(Windows、python 3.5、numpy 1.11.2):

In [6]: %timeit inv(a)
10 loops, best of 3: 86 ms per loop

编辑:

或者,没有 Ipython:

>>>timeit.timeit('inv(a)','from __main__ import inv,a',number=100)/100

类似于 Matlab。

要知道后台使用了什么代码,检查一下:

In [12]: np.__config__.show() 
blas_mkl_info:
include_dirs = ['c:/users/bruno/miniconda3\\Library\\include']
libraries = ['mkl_core_dll', 'mkl_intel_lp64_dll', 'mkl_intel_thread_dll']
...

【讨论】:

  • 谢谢。我正在尝试使用 timeit 运行它,你能发布代码吗?我无法使用 timeit 模块让它工作。
  • B.M.使用了 IPython 或 Jupyter 控制台,它们提供了所谓的“魔法”计时功能。
  • t= timeit.Timer("B=np.linalg.inv(R)","import numpy as np;R=np.random.random((1000,1000))");t.timeit(number=100) 这给了我 9.95。平均接近 90 毫秒。所以我认为使用时间模块是问题所在。从来没有,尽管它具有如此重要的意义。谢谢!
  • 我将帖子编辑为手动 timeit 。我鼓励你采用 Ipython ;)
猜你喜欢
  • 2016-10-10
  • 1970-01-01
  • 2015-11-13
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2017-11-03
  • 1970-01-01
相关资源
最近更新 更多