带有BLAS/ATLAS的预构建numpy?

1 投票
1 回答
1262 浏览
提问于 2025-04-18 04:24

我正在实现一个实时的LMS算法,但是numpy.dot的运算时间比我的采样时间还要长,所以我需要让numpy更快一点(我的矩阵是一维的,长度为100)。

我听说过用ATLAS来构建numpy,但我从来没有做过这种事情,今天花了一整天的时间尝试,结果一点进展都没有……

有人能解释一下为什么没有包含ATLAS的版本吗?有没有人能给我提供一个?还有没有其他方法可以加快点积运算的速度?

我试过numba和scipy.linalg.gemm_dot,但它们似乎都没有提高速度。

我的系统是Windows 8.1,使用的是Intel处理器

1 个回答

4

如果你下载了官方的二进制文件,它们应该已经和ATLAS(自动调优线性代数系统)链接在一起了。如果你想确认一下,可以运行np.show_config()来查看输出。问题在于,ATLAS会检查很多不同的组合和算法,并在编译时保留最佳的选择。所以,当你运行一个预编译的ATLAS时,它实际上是为一台与你的电脑不同的机器优化过的。

那么,你可以考虑以下几种方法来提升dot的性能:

  • 自己编译ATLAS。在Windows上可能有点挑战,但也是可以做到的。注意:你必须使用与编译Python时相同的编译器。也就是说,如果你选择使用MinGW,你需要确保Python也是用MinGW编译的,或者自己编译。
  • 试试Christopher Gohlke的Numpy。它是与MKL链接的,速度比ATLAS快得多(并且在运行时进行所有优化)。
  • 尝试使用Continuum Analytics的Conda和accelerate(同样是与MKL链接的)。这需要付费,除非你是学术用户。在Linux上,Conda比系统自带的Python慢,因为它们必须使用旧编译器以保持兼容性;我不知道在Windows上是否也是这样。
  • 使用Linux。你的Python生活会轻松很多,设置编译环境非常简单。而且,设置Cython也很简单,这样你就可以编译整个算法,可能会获得更快的速度。

关于Cython的说明在Windows上也是适用的,只是实现起来更困难。我几年前在使用Windows时尝试过,结果几天后失败了;我不知道现在情况是否有所改善。

替代方案:

你正在计算两个向量的点积。那么,np.dot可能不是最高效的方法。我建议你试试用简单的Python写法(vec1*vec2).sum()(这个表达式对Numba来说可能会很好,因为它可以优化这个表达式),或者使用numexpr:

ne.evaluate(`sum(vec1 * vec2)`)

Numexpr也会自动并行化这个表达式。

撰写回答