首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >operator.itemgetter或lambda

operator.itemgetter或lambda
EN

Stack Overflow用户
提问于 2013-06-22 04:16:23
回答 3查看 9.2K关注 0票数 36

我很好奇是否有任何迹象表明使用operator.itemgetter(0)lambda x:x[0]中的哪一个更好,特别是在sorted()中作为key关键字参数,因为这是最先想到的用法。是否存在任何已知的性能差异?在这个问题上是否有任何与PEP相关的偏好或指导?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-18 15:13:49

根据我对1000个元组列表的基准测试,使用itemgetter的速度几乎是普通lambda方法的两倍。以下是我的代码:

代码语言:javascript
复制
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)

我还测试了这两种方法在不同列表大小下的性能(运行时间以µs为单位)。

代码语言:javascript
复制
+-----------+--------+------------+
| List size | lambda | itemgetter |
+-----------+--------+------------+
| 100       | 8.19   | 5.09       |
+-----------+--------+------------+
| 1000      | 81.4   | 47         |
+-----------+--------+------------+
| 10000     | 855    | 498        |
+-----------+--------+------------+
| 100000    | 14600  | 10100      |
+-----------+--------+------------+
| 1000000   | 172000 | 131000     |
+-----------+--------+------------+

(生成上图的代码可以在here中找到)

结合从列表中选择多个元素的简洁性,itemgetter显然是sort方法中的赢家。

票数 11
EN

Stack Overflow用户

发布于 2013-06-22 04:22:55

itemgetter的性能稍好一些:

代码语言:javascript
复制
>>> f1 = lambda: sorted(w, key=lambda x: x[1])
>>> f2 = lambda: sorted(w, key=itemgetter(1))
>>> timeit(f1)
21.33667682500527
>>> timeit(f2)
16.99106214600033
票数 43
EN

Stack Overflow用户

发布于 2013-06-22 04:22:39

抛开速度问题不谈,这通常是基于你在哪里创建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()非常相似,只是内置于普通的括号表示法中。)

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17243620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档