【问题标题】:What is the fastest way to quadratic form numpy array multiplication?二次形式的numpy数组乘法的最快方法是什么?
【发布时间】:2023-03-29 10:50:01
【问题描述】:

这两种方法我都试过了

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

【问题讨论】:

  • 最后的[0, 0]是什么?
  • 我需要一个标量值,但它返回的数组只有一个值
  • 如果你真的定义了函数,它仍然那么慢吗?我 认为 lambda 有点慢
  • 您的矩阵有多大?如果它们很大,那么速度瓶颈不在 Numpy 中。获取与英特尔 MKL 或其他一些高性能线性代数库链接的 Numpy 副本。
  • @Erogol:Matlab 使用 Intel MKL,比 ATLAS 优化得更好。除了 ATLAS,您可能想尝试 Openblas,它也是免费的,并且性能可能会更好。

标签: python arrays matlab numpy matrix-multiplication


【解决方案1】:

我同时安装了 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,因为我得到了类似的结果。在使用 Anaconda 学术许可证的 4 年前廉价笔记本电脑上,10000x10000 矩阵大约需要 400 毫秒。
  • 我怀疑“我的算法运行时间为 5 秒”的报告意味着该算法多次计算二次形式。
  • 好点。它是相当开放的。我怀疑他们将 x 和 A 的乘法时间都设置为 1500x1500 数组,但这可能是错误的。
  • 如何检查我的安装是否与正确的后端库集有关
  • 好的,如果其他人仍然有这个问题,您可以使用 import numpynumpy.show_config() 检查您是否正在使用 MKL 如果您使用的是 MKL,不同的“库”选项应该有有几个项目提到了 MKL。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2016-02-06
    • 2022-11-03
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多