python里的operator模块

我们在进行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()支持多参数:

  • After f = itemgetter(2), the call f(r) returns r[2]
  • After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])
  • After f = attrgetter('name'), the call f(b) returns b.name
  • After f = attrgetter('name', 'date'), the call f(b) returns (b.name, b.date)
  • After f = attrgetter('name.first', 'name.last'), the call f(b) returns (b.name.first, b.name.last)
发表于 2020年03月27日 18:50   评论:0   阅读:2041  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo