<p>问题是numba不能直觉判断<code>lookup</code>的类型。如果你在你的方法中放一个<code>print nb.typeof(lookup)</code>,你会看到numba把它当作一个对象,这是很慢的。通常,我只是在局部dict中定义<code>lookup</code>的类型,但是我得到了一个奇怪的错误。相反,我只是创建了一个小包装器,以便可以显式地定义输入和输出类型。</p>
<pre><code>@nb.jit(nb.f8[:](nb.f8[:]))
def numba_cumsum(x):
return np.cumsum(x)
@nb.autojit
def numba_resample2(qs, xs, rands):
n = qs.shape[0]
#lookup = np.cumsum(qs)
lookup = numba_cumsum(qs)
results = np.empty(n)
for j in range(n):
for i in range(n):
if rands[j] < lookup[i]:
results[j] = xs[i]
break
return results
</code></pre>
<p>那么我的时间安排是:</p>
<pre><code>print "Timing Numba Function:"
%timeit numba_resample(qs, xs, rands)
print "Timing Revised Numba Function:"
%timeit numba_resample2(qs, xs, rands)
</code></pre>
<hr/>
<pre><code>Timing Numba Function:
100 loops, best of 3: 8.1 ms per loop
Timing Revised Numba Function:
100000 loops, best of 3: 15.3 µs per loop
</code></pre>
<hr/>
<p>如果你用<code>jit</code>而不是<code>autojit</code>,你可以走得更快一点:</p>
<pre><code>@nb.jit(nb.f8[:](nb.f8[:], nb.f8[:], nb.f8[:]))
</code></pre>
<p>对我来说,从15.3微秒降到12.5微秒,但autojit的表现仍然令人印象深刻。</p>