如何在Cython和Weave中编写快速的log-sum-exp?

Seb*_*ien 7 python numpy cython

我正在研究从Python代码加速log-sum-exp(使用"max trick")操作的选项.我在使用Python 2.7的Windows 8上.我已经使用Numpy,Scipy的实现,Numba,Cython,Weave和numexpr对实现进行了比较,可以在nbviewer上查看.

我原本期望我的Cython和Weave版本是最快的,因为它们最接近本机代码.但事实上,它们比我的其他版本慢.

如何尽可能快地制作这些版本?

编辑:wrt初始笔记本,在所有方法中添加最大技巧,使比较不那么琐碎,更接近我的实际需要.

Rob*_*bon 5

对于float32数据,显式向量化(SSE)c版本比我在我的机器上发布的任何替代版本(~360 us对150 us)快约2.5倍.我没有numba因此我无法尝试.

http://nbviewer.ipython.org/github/rmcgibbo/logsumexp/blob/master/Accelerating%20log-sum-exp.ipynb

注意,这只适用于float32.显式SSE代码的一个缺点是它是特定于数据类型的,我没有花费精力编写双精度版本.

有关SSE实现(BSD)的完整源代码,以及一个简单的setup.py安装程序,访问https://github.com/rmcgibbo/logsumexp/tree/master

%timeit scipy.misc.logsumexp(a)
10.4467
1000 loops, best of 3: 363 µs per loop
10.4467144498
%timeit lse_weave(a)
1000 loops, best of 3: 352 µs per loop
10.4467
%timeit lse_numexpr(a)
1000 loops, best of 3: 360 µs per loop
10.4467162773
%timeit lse_cython(a)
1000 loops, best of 3: 361 µs per loop
10.4467163086
%timeit sselogsumexp.logsumexp(a)  # <--- my version
10000 loops, best of 3: 149 µs per loop
Run Code Online (Sandbox Code Playgroud)