为什么我应该使用operator.itemgetter(x)而不是[x]?

时间:2012-07-02 02:25:32

标签: python operators

这里有一个更普遍的问题:In what situation should the built-in operator module be used in python?

最高回答称,operator.itemgetter(x)比“{1}}”更“整洁”。我觉得情况恰恰相反。

还有其他好处,比如表现吗?

7 个答案:

答案 0 :(得分:20)

除非您的代码处于紧密的内循环中,否则您不应该担心性能,并且实际上是性能问题。相反,请使用最能表达您意图的代码。有些人喜欢lambdas,有些人喜欢itemgetter。有时这只是一种品味问题。

itemgetter更强大,例如,如果您需要一次获取多个元素。例如:

operator.itemgetter(1,3,5)

与:

相同
lambda s: (s[1], s[3], s[5])

答案 1 :(得分:14)

在某些情况下有好处,这是一个很好的例子。

>>> data = [('a',3),('b',2),('c',1)]
>>> from operator import itemgetter
>>> sorted(data, key=itemgetter(1))
[('c', 1), ('b', 2), ('a', 3)]

这种itemgetter的使用非常棒,因为它可以使所有内容都清晰,同时也可以更快,因为所有操作都保留在C侧。

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

使用lambda不是很清楚,它也较慢,除非必须,否则最好不要使用lambda。例如。列表推导优于使用map lambda

答案 2 :(得分:9)

性能。它可以产生很大的不同。在适当的情况下,您可以使用itemgetter在C级别完成一堆内容。

我认为更清楚的主张实际上取决于你最常使用哪种主观,而且非常主观

答案 3 :(得分:7)

一些程序员理解并使用lambdas,但是有一群程序员可能没有接受计算机科学,也不清楚这个概念。对于那些程序员itemgetter()可以使您的意图更清晰。 (我不写lambdas,任何时候我在代码中看到一个,它需要一点额外的时间来处理正在发生的事情并理解代码。)

如果您对其他计算机科学专业人员的编码继续使用lambdas,如果他们更舒服。但是,如果您为更广泛的受众编码,我建议使用itemgetter()

答案 4 :(得分:5)

除了性能和代码样式之外,itemgetter是可选择的,而lambda则不是。如果函数需要保存或在进程之间传递(通常作为较大对象的一部分),这一点很重要。在以下示例中,将itemgetter替换为lambda将导致PicklingError

from operator import itemgetter

def sort_by_key(sequence, key):
    return sorted(sequence, key=key)

if __name__ == "__main__":
    from multiprocessing import Pool

    items = [([(1,2),(4,1)], itemgetter(1)),
             ([(5,3),(2,7)], itemgetter(0))]

    with Pool(5) as p:
        result = p.starmap(sort_by_key, items)
    print(result)

答案 5 :(得分:4)

在提及效果时,我已经比较了operator.itemgetterlambda两种方法,而对于一个小列表,operator.itemgetter的结果优于10%。我个人喜欢itemgetter方法,因为我在排序时大多使用它,它就像是我的关键字。

import operator
import timeit

x = [[12, 'tall', 'blue', 1],
[2, 'short', 'red', 9],
[4, 'tall', 'blue', 13]]


def sortOperator():
    x.sort(key=operator.itemgetter(1, 2))

def sortLambda():
    x.sort(key=lambda x:(x[1], x[2]))


if __name__ == "__main__":
    print(timeit.timeit(stmt="sortOperator()", setup="from __main__ import sortOperator", number=10**7))
    print(timeit.timeit(stmt="sortLambda()", setup="from __main__ import sortLambda", number=10**7))    

>>Tuple: 9.79s, Single: 8.835s
>>Tuple: 11.12s, Single: 9.26s

在Python 3.6上运行

答案 6 :(得分:0)

keysorted()的{​​{1}}参数中使用此参数时,如果在min()operator.itemgetter(1)之间进行选择,则前者通常会更快在两种情况下:


使用lambda x: x[1]

bm

比较的函数定义如下:

sorted()

结果import operator def sort_key_itemgetter(items, key=1): return sorted(items, key=operator.itemgetter(key)) def sort_key_lambda(items, key=1): return sorted(items, key=lambda x: x[key]) 的速度提高了10%至15%。

(全面分析here


使用sort_key_itemgetter()

enter image description here

比较的函数定义如下:

min()

结果import operator def min_key_itemgetter(items, key=1): return min(items, key=operator.itemgetter(key)) def min_key_lambda(items, key=1): return min(items, key=lambda x: x[key]) 的速度提高了约20%至60%。

(全面分析here