我很好奇是否有任何迹象表明哪个operator.itemgetter(0)
或哪个lambda x:x[0]
更好,特别是sorted()
作为key
关键字参数,因为这是首先想到的用途。是否有任何已知的性能差异?是否有任何与 PEP 相关的偏好或指导?
问问题
9690 次
3 回答
43
itemgetter 的性能稍好一些:
>>> f1 = lambda: sorted(w, key=lambda x: x[1])
>>> f2 = lambda: sorted(w, key=itemgetter(1))
>>> timeit(f1)
21.33667682500527
>>> timeit(f2)
16.99106214600033
于 2013-06-21T20:22:55.467 回答
19
撇开速度问题不谈,这通常取决于您在哪里创建 itemgetter 或 lambda 函数,我个人认为itemgetter
一次获取多个项目非常好:例如,itemgetter(0, 4, 3, 9, 19, 20)
将创建一个返回项目元组的函数传递给它的 listlike 对象的指定索引。要使用 lambda 执行此操作,您需要lambda x:x[0], x[4], x[3], x[9], x[19], x[20]
,这要笨重得多。(然后一些包,例如具有高级索引,除了内置到普通括号符号之外numpy
,它的工作原理很像。)itemgetter()
于 2013-06-21T20:22:39.413 回答
12
根据我对 1000 个元组列表的基准测试,使用的速度几乎是普通方法itemgetter
的两倍。lambda
以下是我的代码:
In [1]: a = list(range(1000))
In [2]: b = list(range(1000))
In [3]: import random
In [4]: random.shuffle(a)
In [5]: random.shuffle(b)
In [6]: c = list(zip(a, b))
In [7]: %timeit c.sort(key=lambda x: x[1])
81.4 µs ± 433 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [8]: random.shuffle(c)
In [9]: from operator import itemgetter
In [10]: %timeit c.sort(key=itemgetter(1))
47 µs ± 202 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
我还针对各种列表大小测试了这两种方法的性能(以微秒为单位的运行时间)。
+-----------+--------+------------+
| List size | lambda | itemgetter |
+-----------+--------+------------+
| 100 | 8.19 | 5.09 |
+-----------+--------+------------+
| 1000 | 81.4 | 47 |
+-----------+--------+------------+
| 10000 | 855 | 498 |
+-----------+--------+------------+
| 100000 | 14600 | 10100 |
+-----------+--------+------------+
| 1000000 | 172000 | 131000 |
+-----------+--------+------------+
(生成上图的代码可以在这里找到)
结合从列表中选择多个元素的简洁性,itemgetter
显然是在排序方法中使用的赢家。
于 2018-12-18T07:13:49.357 回答