用于在python中按多个谓词排序的最快排序机制

时间:2017-09-09 03:12:54

标签: python performance sorting

import operator
a = [[1,0.7,1],[4,0.8,1],[5,0.8,0.99],[11,0.9,0.98]]
b = sorted(a, key=lambda x:x[1], reverse=True);
c = sorted(b, key=lambda x:x[2], reverse=True);
s = sorted(a, key=lambda x : (x[2],x[1]), reverse=True);
i = sorted(a, key = operator.itemgetter(2, 1),reverse=True);

以下输出,例如c,s和i,这是最快的方法(在最坏的情况下的时间方面),用于对长度约为20,000的5 Diamensional数组进行排序。或者有没有任何特定的方式来做它而不是c,s,i

1 个答案:

答案 0 :(得分:2)

我不确定将前两个与第三个和第四个进行比较是否有任何意义 - 他们会做不同的事情。

sorted(a, key=lambda x:x[1], reverse=True)

按第二个元素 排序列表列表,而......

sorted(b, key=lambda x:x[2], reverse=True)

按第三个元素 排序列表列表,无论列表之前如何排序。

sorted(a, key=lambda x: (x[2],x[1]), reverse=True)
sorted(a, key=operator.itemgetter(2, 1), reverse=True)

这两种方法都按第三个排序列表以及第二个元素。关于第3个元素的关系基本上被第二个元素打破了。

<强>性能

100000 loops, best of 3: 3.62 µs per loop
100000 loops, best of 3: 2.9 µs per loop

最后一种方法更快,因为lambda函数较慢。

中( 100K元素

10 loops, best of 3: 60.7 ms per loop
10 loops, best of 3: 50.7 ms per loop

大( 3M元素

1 loop, best of 3: 2.07 s per loop
1 loop, best of 3: 1.71 s per loop

重要的是要理解这些方法的理论时间复杂度完全相同 - 它们的增长顺序是相同的。这里唯一的区别是你使用的技术,这可以在速度上产生微小的差异。同样重要的是要理解,如果您正在寻找高性能,那么Python并不是您应该使用的语言。