Python更好地替代排序关键lambda

bcd*_*dan 0 python sorting lambda

我需要对包含元组的列表进行排序.我可以使用它们排序key=lambda.该列表大于1000个元素.

>>> a = [(<object>, 4), (<object>, 5), (<object>, -2)....]
>>> b = sorted(a, key=lambda tup: tup[1])
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来实现这一目标?

Ale*_*agh 5

您可以使用itemgetter

>>> from operator import itemgetter
>>> a = [(None, 4), (None, 5), (None, -2)]
>>> b = sorted(a, key=itemgetter(1))
>>> b
[(None, -2), (None, 4), (None, 5)]
Run Code Online (Sandbox Code Playgroud)

现在,如果你想看一下性能,这里是itemgetter:

In [3]: %timeit sorted(a, key=itemgetter(1))
1000000 loops, best of 3: 732 ns per loop

In [4]: %timeit sorted(a, key=lambda tup: tup[1])
1000000 loops, best of 3: 804 ns per loop
Run Code Online (Sandbox Code Playgroud)

所以,对于一个小清单来说,不是太戏剧化.让我们高档这个:

In [1]: import random
In [2]: a = [(i, random.randint(0, 100)) for i in range(100000)]
In [3]: %timeit sorted(a, key=itemgetter(1))
10 loops, best of 3: 30.5 ms per loop
In [4]: %timeit sorted(a, key=lambda tup: tup[1])
10 loops, best of 3: 35.6 ms per loop
Run Code Online (Sandbox Code Playgroud)

所以即使在升级之后仍然是稍快一点​​的方法.但是,我使用itemgetter,因为它是干净的代码,而不是因为它更快.在性能上编写干净的代码,并在必要时进行优化.1000个元素是没有的:你知道自己在做什么更好.

请记住,过早[或不必要]的优化是万恶之源.特别是对于这样一个小型数据集,需要几毫秒才能完成整个任务.