带有BLAS/ATLAS的预构建numpy?
我正在实现一个实时的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也会自动并行化这个表达式。