我正在实现一个实时LMS算法,并且numpy.dot比我的采样时间花费更多的时间,因此我需要numpy更快(我的矩阵是一维且长100个)。
我已经读过关于用ATLAS等构建numpy的知识,但是从来没有做过这样的事情,并且整天都在尝试以零成功率做到这一点。
有人可以解释为什么没有包含ATLAS的版本吗?谁能给我一个?还有其他加快点产品速度的方法吗?
我尝试了numba和scipy.linalg.gemm_dot,但它们似乎都没有加快速度。
我的系统是装有英特尔处理器的Windows8.1
最佳答案
如果您下载了官方二进制文件,它们应该与ATLAS链接在一起。如果要确定,请检查np.show_config()
的输出。问题在于ATLAS(自动调谐线性代数系统)会检查许多不同的组合和算法,并在编译时保持最佳状态。因此,当您运行预编译的ATLAS时,您正在针对与您的计算机不同的计算机对其进行优化运行。
因此,您可以选择的改进点的方法是:
自己编译ATLAS。在Windows上,这可能会有些挑战,但它是可行的。注意:必须使用与编译Python相同的编译器。也就是说,如果您决定使用MinGW,则需要使用MinGW编译Python或自行构建。
试试克里斯托弗·戈尔克(Christopher Gohlke)的《 Numpy》。它与MKL链接在一起,它比ATLAS快得多(并且在运行时进行所有优化)。
尝试使用Continuum Analytics的带有加速功能的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还将自动对表达式进行并行化。
关于python - 用BLAS/ATLAS预建numpy吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23316526/