我们在进行map(), sorted(), itertools.groupby()操作时,往往需要传递一个函数作为参数,此时通常我们使用lambda表达式,而operator以C语言实现的方式为我们提供了各种基本的操作函数,简单且高效,这就是operator库所存在的意义。
当然lambda在书写时并不复杂,所以问题就在于lambda函数与C语言函数指针,到底谁更快,且快多少的问题了。
拿最常见的itemgetter()举例:
l = [(randint(1, 2**32), randint(1, 2**32)) for i in range(10000)]
t1 = time()
for i in range(100):
ll = l.copy()
ll.sort(key=itemgetter(1))
t2 = time()
print(t2-t1) ==>0.32s
t1 = time()
for i in range(100):
ll = l.copy()
ll.sort(key=lambda x:x[1])
t2 = time()
print(t2-t1) ==>0.37s
拿次常见的attrgetter()举例:
class A:
def __init__(self, a, b):
self.a = a
self.b = b
la = [A(randint(1, 2**32), randint(1, 2**32)) for i in range(10000)]
t1 = time()
for i in range(100):
sorted(la, key=attrgetter('b'))
t2 = time()
print(t2-t1) ==>0.34s
t1 = time()
for i in range(100):
sorted(la, key=lambda x:x.b)
t2 = time()
print(t2-t1) ==>0.40s
大概均快15%左右。还有lt, gt, or, xor, mul, div, indexOf, concat, contains等等,operator提供了非常多的C函数。
特别注意itemgetter()和attrgetter()支持多参数: