在对给定数组中的前n=1000个元素进行排序时,为什么瓶颈.argpartsort具有最好的性能(考虑到我没有弄乱某些东西),有原因吗?
我已经创建了以下脚本:

d = numpy.random.rand(300000)
l = []
for i in range(5):
    to = time()
    ind = argpartsort(-d, pow(10,i))
    tf = time()
    l.append((pow(10,i), tf - to))

结果是:
 [(1, 0.008157968521118164),
 (10, 0.006367921829223633),
 (100, 0.006164073944091797),
 (1000, 0.002994060516357422),
 (10000, 0.004293203353881836)]

绘制结果可以得到:
我认为argpartsort跟踪的值越少,应该越快,但这不是我观察到的。我是在某个地方搞砸了,还是在预料之中?
提前谢谢!

最佳答案

你现在只看5步。下面是你走500步时的样子:
我相信这种波动来自Hoare's quickselect(枢轴选择是个问题——它可能非常好,但可能非常糟糕,相当随机)。quicksort中也使用了类似的想法,因此让我们看看:

d = numpy.random.rand(3000)

def test(n):
    ld = d[:n]
    s = time.time()
    ld.sort()
    e = time.time()
    return e-t

这段代码建议,为了增加i排序所花费的时间不应该减少(因为我们只取同一数组中较大的片段,所以如果我们能够更快地对较大的片段进行排序,那么我们应该至少以同样的速度对较小的片段进行排序)。结果如下:
正如你所看到的,我们这里也有波动(我不是说大的跳跃,这可能是由于我的机器做的其他事情,但我是说它们之间的微小跳跃)。问题在于算法本身。平均来说,它真的很快。
最后请注意,您的机器同时所做的一切也会影响测试,因此很难给出完整的诊断。

关于python - Python瓶颈argpartsort性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20885293/

10-09 06:00