<p>提出的瓶颈解决方案中的每个负号</p>
<pre><code>-bottleneck.partsort(-a, 10)[:10]
</code></pre>
<p>复制数据。我们可以通过</p>
<pre><code>bottleneck.partsort(a, a.size-10)[-10:]
</code></pre>
<p>也是建议的numpy解决方案</p>
<pre><code>a.argsort()[-10:]
</code></pre>
<p>返回索引而不是值。修复方法是使用索引查找值:</p>
<pre><code>a[a.argsort()[-10:]]
</code></pre>
<p>两个瓶颈解决方案的相对速度取决于初始数组中元素的顺序,因为这两种方法在不同的点上分割数据。</p>
<p>换句话说,使用任何一个特定的随机数组计时都可以使这两种方法看起来更快。</p>
<p>平均100个随机数组的时间,每个数组有1000000个元素,给出</p>
<pre><code>-bn.partsort(-a, 10)[:10]: 1.76 ms per loop
bn.partsort(a, a.size-10)[-10:]: 0.92 ms per loop
a[a.argsort()[-10:]]: 15.34 ms per loop
</code></pre>
<p>其中定时代码如下:</p>
<pre><code>import time
import numpy as np
import bottleneck as bn
def bottleneck_1(a):
return -bn.partsort(-a, 10)[:10]
def bottleneck_2(a):
return bn.partsort(a, a.size-10)[-10:]
def numpy(a):
return a[a.argsort()[-10:]]
def do_nothing(a):
return a
def benchmark(func, size=1000000, ntimes=100):
t1 = time.time()
for n in range(ntimes):
a = np.random.rand(size)
func(a)
t2 = time.time()
ms_per_loop = 1000000 * (t2 - t1) / size
return ms_per_loop
t1 = benchmark(bottleneck_1)
t2 = benchmark(bottleneck_2)
t3 = benchmark(numpy)
t4 = benchmark(do_nothing)
print "-bn.partsort(-a, 10)[:10]: %0.2f ms per loop" % (t1 - t4)
print "bn.partsort(a, a.size-10)[-10:]: %0.2f ms per loop" % (t2 - t4)
print "a[a.argsort()[-10:]]: %0.2f ms per loop" % (t3 - t4)
</code></pre>