<p>你试过使用<a href="https://github.com/numba/numba" rel="nofollow">Numba</a>吗?它是一个包,它允许您用JIT编译器包装通常较慢的Python代码。我用Numba快速解决了你的问题,并得到了显著的加速。使用IPython的magic <code>timeit</code>魔术函数,<code>custom_convolution</code>函数用了~18秒,而Numba的优化函数用了10.4毫秒,<strong>的速度提高了1700</strong>。在</p>
<p>下面是Numba是如何实现的。在</p>
<pre><code>import numpy as np
from numba import jit, double
s = 15
array_a = np.random.rand(s ** 3).reshape(s, s, s)
array_b = np.random.rand(s ** 3).reshape(s, s, s)
# Original code
def custom_convolution(A, B):
dimA = A.shape[0]
dimB = B.shape[0]
dimC = dimA + dimB
C = np.zeros((dimC, dimC, dimC))
for x1 in range(dimA):
for x2 in range(dimB):
for y1 in range(dimA):
for y2 in range(dimB):
for z1 in range(dimA):
for z2 in range(dimB):
x = x1 + x2
y = y1 + y2
z = z1 + z2
C[x, y, z] += A[x1, y1, z1] * B[x2, y2, z2]
return C
# Numba'ing the function with the JIT compiler
fast_convolution = jit(double[:, :, :](double[:, :, :],
double[:, :, :]))(custom_convolution)
</code></pre>
<p>如果你计算两个函数结果之间的残差,你将得到零。这意味着JIT实现可以正常工作。在</p>
^{pr2}$
<p>我得到的输出是<code>0.0</code>。在</p>
<p>您可以将Numba安装到当前的Python设置中,也可以使用来自连续体.io. 在</p>
<p>最后但并非最不重要的是,Numba的功能比<code>scipy.signal.fftconvolve</code>功能快了几倍。在</p>
<p>注意:我用的是Python而不是Python。对于Numba的表现,这两个包有些不同,但我认为不会有太大的差别。在</p>