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

2024-05-18 14:51:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试过这两种选择

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秒

我想用核动力,但显然我需要一种方法来改善这个糟糕的结果。怎样才能得到更快的二次型矩阵,向量积?

注意:我分析了代码,这个lambda函数喝下了所有的果汁。 Improvemnt:我只需删除本机Ubuntu包scipy和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 

我提高了一点性能,但是仍然低于Matlab


Tags: installpiplambdadevnumpy算法getnp
2条回答

我已经安装了NumPy和Matlab,对于10000x1000矩阵,它们都需要45毫秒。

考虑到您的时间安排,我怀疑x不是一个列向量。 如果要同时对多个列向量执行此计算,请看我对以下问题的回答: Calculate "v^T A v" for a matrix of vectors v。 如果x只是一个列向量(在NumPy或Matlab中),则列出的计时非常慢。

不过,我怀疑这一差异也可能来自于NumPy安装的编译方式。 这实际上是NumPy和Matlab使用的BLAS函数的计时。 我相信两者都在我的机器上调用同一个底层库,因为我已经将NumPy链接到了Intel的MKL上。 如果NumPy是针对优化良好的BLAS(如Intel MKL)构建的,那么像这样的大型向量操作的运行速度应该与Matlab大致相同,因为它们都可能调用相同的低级BLAS函数。 如果您的NumPy版本没有使用优化的BLAS进行编译,那么性能会更差。

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

获得正确编译的NumPy版本的一个简单方法是使用预构建的发行版。 水蟒和热情是非常好的,但他们将需要订阅,以获得优化版本。 学术许可证是免费的。 你也可以看这里:http://www.lfd.uci.edu/~gohlke/pythonlibs/

最后,我做的是改变线性代数函数的numpy有界库。它在默认情况下使用ATLAS,但我更努力(大约4小时)将其更改为OpenBlas。我找到了那个指南Compiling numpy with OpenBLAS integration,然后一点一点地跟着。结果是工作的时间更快。它仍然缺乏与Matlab(英特尔MLK)相关的2.5秒,但可以容忍3秒的执行。

相关问题 更多 >

    热门问题