Prebuilt numpy with BLAS/ATLAS?



我正在实现一个实时LMS算法,numpy.dot比我的采样时间花费更多的时间,所以我需要numpy更快(我的矩阵是1D和100长)。

我读过关于用ATLAS等构建numpy的文章,但从未做过这样的事情,我花了一整天的时间试图做到这一点,但没有成功。。。

有人能解释一下为什么没有包含ATLAS的构建吗?有人能给我一个吗?有没有其他方法可以加快点积的速度?

我试过numba和scipy.linal.gemm_dot,但它们似乎都没有加快速度。

我的系统是Windows8.1,带有英特尔处理器

如果您下载官方二进制文件,它们应该与ATLAS链接。如果要确定,请检查np.show_config()的输出。问题是ATLAS(自动调谐线性代数系统)检查许多不同的组合和算法,并在编译时保持最佳状态。因此,当你运行预编译的ATLAS时,你运行的是针对不同于你的计算机进行优化的。

所以,你可以选择提高点是:

  • 自己编译ATLAS。在Windows上,这可能有点挑战性,但它是可行的。注意:必须使用与编译Python相同的编译器。也就是说,如果你决定使用MinGW,你需要用MinGW编译Python,或者自己构建它
  • 试试克里斯托弗·高尔克的《麻木》。它与MKL相关联,后者比ATLAS快得多(并在运行时进行所有优化)
  • 试试Continuum analytics的Conda with 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还将自动对表达式进行并行处理。

最新更新