Python3 operator
Function forms of every operator, itemgetter/attrgetter, and why they beat lambdas in hot paths.
Key Points`operator.itemgetter` is faster and picklable compared with an equivalent lambda — use it for sorting and grouping keys.
Operators as Functions
Python
import operator as op
op.add(2, 3) # 5
op.mul(2, 3) # 6
op.truediv(7, 2) # 3.5
op.floordiv(7, 2) # 3
op.mod(7, 2) # 1
op.pow(2, 10) # 1024
op.neg(5) # -5
op.not_(True) # False
op.contains([1, 2], 2) # True
op.getitem({"a": 1}, "a") # 1itemgetter / attrgetter
These build key functions without a lambda. They are implemented in C, so they are faster, and they survive pickling — which matters for multiprocessing.
Python
from operator import itemgetter, attrgetter, methodcaller
rows = [{"name": "b", "age": 30}, {"name": "a", "age": 25}]
rows.sort(key=itemgetter("age"))
rows.sort(key=itemgetter("age", "name")) # 多级排序
class P:
def __init__(self, x, y):
self.x, self.y = x, y
pts = [P(1, 2), P(0, 5)]
pts.sort(key=attrgetter("x"))
upper = methodcaller("upper")
upper("abc") # 'ABC'With reduce and map
Python
from functools import reduce
from operator import add, mul
reduce(add, [1, 2, 3, 4]) # 10
reduce(mul, [1, 2, 3, 4]) # 24
# 按字段求和
sum(map(itemgetter("amount"), orders))| Lambda | operator |
|---|---|
| lambda r: r['age'] | itemgetter('age') |
| lambda p: p.x | attrgetter('x') |
| lambda s: s.upper() | methodcaller('upper') |
| lambda a, b: a + b | add |
For multiprocessing, a lambda as
key= cannot be pickled and will fail. itemgetter can.运算符即函数
Python
import operator as op
op.add(2, 3) # 5
op.mul(2, 3) # 6
op.truediv(7, 2) # 3.5
op.floordiv(7, 2) # 3
op.mod(7, 2) # 1
op.pow(2, 10) # 1024
op.neg(5) # -5
op.not_(True) # False
op.contains([1, 2], 2) # True
op.getitem({"a": 1}, "a") # 1itemgetter 与 attrgetter
它们不用 lambda 就能构造键函数。C 实现所以更快,而且可以被 pickle —— 这点对多进程很重要。
Python
from operator import itemgetter, attrgetter, methodcaller
rows = [{"name": "b", "age": 30}, {"name": "a", "age": 25}]
rows.sort(key=itemgetter("age"))
rows.sort(key=itemgetter("age", "name")) # 多级排序
class P:
def __init__(self, x, y):
self.x, self.y = x, y
pts = [P(1, 2), P(0, 5)]
pts.sort(key=attrgetter("x"))
upper = methodcaller("upper")
upper("abc") # 'ABC'配合 reduce 与 map
Python
from functools import reduce
from operator import add, mul
reduce(add, [1, 2, 3, 4]) # 10
reduce(mul, [1, 2, 3, 4]) # 24
# 按字段求和
sum(map(itemgetter("amount"), orders))| lambda 写法 | operator 写法 |
|---|---|
| lambda r: r['age'] | itemgetter('age') |
| lambda p: p.x | attrgetter('x') |
| lambda s: s.upper() | methodcaller('upper') |
| lambda a, b: a + b | add |
多进程场景里,
key= 用 lambda 无法 pickle 会直接报错,itemgetter 可以。