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



我尝试了这两个替代方案

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,但显然我需要一种改善这种crummy结果的方法。如何获得更快的二次形式矩阵,矢量产品?

Note :我介绍了代码,此lambda功能会喝所有的果汁。 Imprivemnt :我只是删除Scipy的本机Ubuntu软件包,然后安装了Numpy,然后安装了以下内容

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 

i稍微提高了性能,但仍低于Matlab

我同时安装了numpy和matlab,它们都需要10000x10000矩阵大约45毫秒。

考虑到您的时间,我怀疑x不是一个列向量。如果您想一次对多列向量进行此计算,请查看我对此问题的回答:计算" v^t a v&quot"对于向量v的矩阵v。如果x只是一个列向量(在numpy或matlab)。

,您列出的时间非常慢。 但是,我怀疑

,差异也可能来自于您编译的Numpy安装的方式。这实际上是Numpy和Matlab使用的BLA函数的时机。我相信两者都在我的机器上列出了同样的基础库,因为我与英特尔的MKL链接了Numpy。如果Numpy是针对诸如Intel MKL(这样的大型矢量操作)构建的,则类似的大型向量操作应与MATLAB大致相同的速度运行,因为它们都可能调用相同的较低级别BLAS功能。如果未使用优化的Blas编制您的Numpy版本,则性能会更糟。

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

获得正确编译的Numpy版本的一种简单方法是使用预构建的分布。Anaconda和Enth期非常好,但是他们需要订阅才能获得优化版本。可以免费获得学术许可。您也可以在这里查看:http://www.lfd.uci.edu/~gohlke/pythonlibs/

最后,我所做的就是更改线性代数函数的numpy的有限库。它正在使用地图集进行默认,但我将其努力(例如4个小时)将其更改为OpenBlas。我发现该指南与OpenBlas集成一起编译Numpy,然后点点刻度。结果是使用更快的时间。它仍然缺乏与MATLAB(Intel MLK)2.5秒相关的,但执行3秒仍可忍受。

最新更新