二次形式numpy数组乘法的最快方法是什么?

时间:2014-01-29 23:56:02

标签: python arrays matlab numpy matrix-multiplication

我尝试过这两种选择

objective = lambda A, x : (np.dot(x.T ,np.dot(A, x)))[0,0]
objective = lambda A, x : (np.matrix(x).T * np.matrix(A) * np.matrix(x))[0,0]

使用主要算法,我的算法运行时间为5秒 继续我有14秒

使用MATLAB我得到2秒

我想和Numpy一起去,但显然我需要一种方法来改善这种糟糕的结果。如何获得更快的二次型矩阵,矢量积?

注意:我描述了代码,这个lambda函数可以让所有人都知道。 改进:我只是删除scipy和numpy的原生Ubuntu软件包,然后安装以下内容

sudo pip install numpy
sudo apt-get install libatlas-base-dev gfortran
sudo pip install scipy
sudo apt-get install libpng-dev libfreetype6-dev
sudo pip install matplotlib 

我提高了性能,但仍低于Matlab

2 个答案:

答案 0 :(得分:5)

我安装了NumPy和Matlab,对于10000x10000矩阵,它们都需要45毫秒左右。

考虑到您的时间安排,我怀疑x不是单列向量。 如果你想同时对多个列向量进行计算,请查看我对这个问题的答案: Calculate "v^T A v" for a matrix of vectors v。 如果x只是一个列向量(在NumPy或Matlab中),那么列出的时间非常慢。

但是,我怀疑,差异也可能来自你的NumPy安装编译方式。 这实际上是NumPy和Matlab使用的BLAS函数的时间。 我相信两者都是在我的机器上调用相同的底层库,因为我将NumPy与英特尔的MKL挂钩。 如果NumPy是针对像英特尔MKL这样经过良好优化的BLAS构建的,那么像这样的大型矢量运算应该以与Matlab大致相同的速度运行,因为它们都可能调用相同的低级BLAS函数。 如果您的NumPy版本未使用优化的BLAS进行编译,则性能会更差。

如果您知道NumPy的安装已经与MKL链接,您可以尝试设置MKL_NUM_THREADS环境变量以匹配系统上的处理器数量。

获取正确编译的NumPy版本的一种简单方法是使用预构建的分发。 Anaconda和Enthought非常好,但他们需要订阅以获得优化版本。 学术许可证免费提供。 您还可以在此处查看:http://www.lfd.uci.edu/~gohlke/pythonlibs/

答案 1 :(得分:2)

最后,我所做的是为线性代数函数更改numpy的有界库。它使用ATLAS作为默认值,但我更加努力(比如4小时)将其更改为OpenBlas。我找到了导游Compiling numpy with OpenBLAS integration并一点一点地跟着。结果是更快的时间。它仍然缺乏Matlab(英特尔MLK)2.5秒,但可以忍受3秒执行。