这里有一个更普遍的问题:In what situation should the built-in operator
module be used in python?
最高回答称,operator.itemgetter(x)
比“{1}}”更“整洁”。我觉得情况恰恰相反。
还有其他好处,比如表现吗?
答案 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.itemgetter
和lambda
两种方法,而对于一个小列表,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
答案 6 :(得分:0)
在key
或sorted()
的{{1}}参数中使用此参数时,如果在min()
和operator.itemgetter(1)
之间进行选择,则前者通常会更快在两种情况下:
使用lambda x: x[1]
比较的函数定义如下:
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()
比较的函数定义如下:
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)