使用BLAS / ATLAS预建numpy?

时间:2014-04-26 21:08:03

标签: python numpy scipy

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

我已经阅读过关于用ATLAS等建立numpy的内容,但从来没有做过这样的事情并花了我一整天的努力去做,没有成功......

有人可以解释为什么没有包含ATLAS的构建吗?任何人都可以提供一个吗?有没有其他方法来加速点积?

我已尝试过numba和scipy.linalg.gemm_dot,但似乎都没有加速。

我的系统是带有Intel处理器的Windows8.1

1 个答案:

答案 0 :(得分:4)

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

所以,你改进dot的选择是:

  • 自己编译ATLAS。在Windows上它可能有点挑战,但它是可行的。注意:您必须使用用于编译Python的相同编译器。也就是说,如果您决定使用MinGW,则需要使用MinGW编译Python,或者自己构建。
  • 尝试Christopher Gohlke的Numpy。它与MKL相关联,比ATLAS快得多(并且在运行时进行所有优化)。
  • 尝试Continuum分析'Conda加速(也与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还会自动并行化表达式。