我正在研究从Python代码加速log-sum-exp(使用“max trick”)操作的选项。 我在使用Python 2.7的Windows 8上。我使用Numpy,Scipy的实现,Numba,Cython,Weave和numexpr对实现进行了比较,可以查看here on nbviewer。
我原本期望我的Cython和Weave版本是最快的,因为它们最接近本机代码。但实际上,它们比我的其他版本慢。
如何尽快制作这些版本?
编辑:wrt初始笔记本,在所有方法中添加了最大技巧,使比较变得不那么琐碎,更接近我的实际需要。
答案 0 :(得分: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