Python 小技巧-利用 itemgetter 提升排序速Python 小技巧-利用 itemgetter 提升排序速度

2022-10-25 21:02:58 浏览数 (2)

排序是编程是最常遇到的场景了,今天分享一个小技巧,可以让 Python 排序的速度有所提升。你看完可以收藏备用。

通常,我们要排序的数据并不是纯数字或纯字母,而是各种数据类型的混合,比如要排序的数据可能是这个样子:

代码语言:javascript复制
data = [('c',3),('b',1),('a',2)]

默认情况下,排序按照列表元素的第一个值进行的排序:

代码语言:javascript复制
In [6]: data = [('c',3),('b',1),('a',2)]

In [7]: sorted(data)
Out[7]: [('a', 2), ('b', 1), ('c', 3)]

In [8]:

如果要按照第二个值进行排序,则需要传入一个 lambda 函数,来指定要排序的 key:

代码语言:javascript复制
In [8]: data = [('c',3),('b',1),('a',2)]

In [9]: sorted(data,key = lambda x:x[1])
Out[9]: [('b', 1), ('a', 2), ('c', 3)]

In [10]:

现在,你可以不用 lambda 函数,而是使用 itemgetter 函数,而且速度更快。

itemgetter 函数可以生成高效的 getter 函数版本,可以与 sorted() 函数结合使用以提高排序操作的性能。

上面的代码就可以写成这样:

代码语言:javascript复制
In [11]: from operator import itemgetter

In [12]: data = [('c',3),('b',1),('a',2)]

In [13]: sorted(data,key = itemgetter(1))
Out[13]: [('b', 1), ('a', 2), ('c', 3)]

你可能好奇,itemgetter 是如何工作的?那么请看下面的代码:

代码语言:javascript复制
In [14]: item = ('c',3)

In [15]: getter = itemgetter(1)

In [16]: getter(item)
Out[16]: 3

In [17]: getter = itemgetter(0)

In [18]: getter(item)
Out[18]: 'c'

In [19]: item = {'c':3}

In [22]: getter = itemgetter('c')

In [23]: getter(item)
Out[23]: 3

itemgetter() 是 Python 标准库的一部分,向 itemgetter() 传递一个参数,这个参数或者是索引位置,或者是字典的键,然后 itemgetter() 函数将返回一个可以调用的 getter 对象。

现在让我们来测试一下 lambda 和 itemgetter 在排序时,到底哪个更高效?

从上面的结果可以看出,使用 itemgetter() 更高效。

最后的话

如果要排序的数据比较大,那就用 itemgetter 吧,丢弃 key = lambda... 。如果有收获,还请点赞、关注、转发。

0 人点赞