operator.itemgetter 比 lambda 快是因为其为 c 实现,避免了 python 层函数调用开销和对象创建;实测对 10 万数据排序快约 33%(0.028s vs 0.042s)。

为什么用 operator.itemgetter 比 lambda 快?
因为 operator.itemgetter 是 C 实现的,而 lambda x: x[1] 是 Python 解释器逐行执行的。对 10 万条数据排序时,前者平均快约 33%(实测耗时 0.028s vs 0.042s)。关键不是“写起来短”,而是解释器少了一层函数调用开销和对象创建过程。
itemgetter 和 attrgetter 怎么选?
看你的数据结构类型:
- 元组、列表、字典的
.items()结果 → 用itemgetter,比如itemgetter(1)取第二个元素,itemgetter('score')取字典键 - 自定义类实例 → 用
attrgetter,比如attrgetter('age')直接取属性,比lambda x: x.age更快且支持链式访问(attrgetter('profile.last_login')) - 要调用方法(如
.upper()或.get_value())→ 改用methodcaller,不能靠itemgetter或attrgetter
多级排序时 itemgetter 的参数怎么传?
直接传多个索引或键名,它会返回一个元组作为排序键:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
from operator import itemgetter
data = [('Alice', 'Smith', 88), ('Bob', 'Johnson', 92), ('Charlie', 'Smith', 85)]
sorted(data, key=itemgetter(1, 0)) # 先按姓氏(索引1),再按名字(索引0)
注意:itemgetter(1, 0) 等价于 lambda x: (x[1], x[0]),但前者不构造新 lambda 对象,也不触发 Python 层的 tuple 创建开销。
什么时候不该用 operator?
三种典型场景下,硬套 itemgetter 或 attrgetter 反而出错或低效:
- 需要做空值处理(如字段可能为
None),itemgetter('score')会直接抛KeyError或AttributeError,得回退到lambda加判断 - 排序逻辑涉及计算(如按 “年龄的平方” 排序),
itemgetter只能取值,不能算,必须用lambda - 数据混合类型(比如列表里既有字典又有对象),
attrgetter对字典失效,itemgetter对对象失效,这时统一用lambda+getattr/get更稳
性能优势只在“纯提取”场景成立;一旦引入分支、计算或容错逻辑,C 函数的优势就没了,反而增加理解成本。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










