<p><em>免责声明:我是下面提到的工具的核心开发人员。</em></p>
<p>作为Cython的替代方案,您可以尝试一下<a href="http://pythran.readthedocs.io" rel="nofollow noreferrer">Pythran</a>。
原始NumPy代码的单个注释:</p>
<pre><code>#pythran export npperm(float[:, :])
import numpy as np
def npperm(M):
n = M.shape[0]
d = np.ones(n)
j = 0
s = 1
f = np.arange(n)
v = M.sum(axis=0)
p = np.prod(v)
while j < n-1:
v -= 2*d[j]*M[j]
d[j] = -d[j]
s = -s
prod = np.prod(v)
p += s*prod
f[0] = 0
f[j] = f[j+1]
f[j+1] = j+1
j = f[0]
return p/2**(n-1)
</code></pre>
<p>编制依据:</p>
^{pr2}$
<p>产生与Cython类似的加速:</p>
<pre><code>> # numpy version
> python -mtimeit -r3 -n1 -s 'from scipy.stats import ortho_group; from perm import npperm; import numpy as np; np.random.seed(7); M = ortho_group.rvs(23)' 'npperm(M)'
1 loops, best of 3: 21.7 sec per loop
> # pythran version
> pythran perm.py
> python -mtimeit -r3 -n1 -s 'from scipy.stats import ortho_group; from perm import npperm; import numpy as np; np.random.seed(7); M = ortho_group.rvs(23)' 'npperm(M)'
1 loops, best of 3: 171 msec per loop
</code></pre>
<p>不需要重新实现<code>sum_axis</code>(Pythran负责)。在</p>
<p>更有趣的是,Pythran能够通过一个选项标志识别几个可矢量化(在生成SSE/AVX内部函数的意义上)模式:</p>
<pre><code>> pythran perm.py -DUSE_BOOST_SIMD -march=native
> python -mtimeit -r3 -n10 -s 'from scipy.stats import ortho_group; from perm import npperm; import numpy as np; np.random.seed(7); M = ortho_group.rvs(23)' 'npperm(M)'
10 loops, best of 3: 93.2 msec per loop
</code></pre>
<p>这使得一个最终的x232加速相对于NumPy版本,一个类似于展开的Cython版本,没有太多的手动调整。在</p>