2012-07-02 51 views
24

這裏有一個更普遍的問題:In what situation should the built-in operator module be used in python?爲什麼我應該使用operator.itemgetter(x)而不是[x]?

頂端回答稱,operator.itemgetter(x)是「整潔」比,大概比lambda a: a[x]。我覺得情況正好相反。

是否還有其他的好處,比如性能?

+0

它當你的文字過濾器或lambda表達式 –

+0

如果您在團隊誰使用lambda表達式其他開發人員的工作只是更清晰,那麼你應該使用一個lambda表達式:) – astynax

+0

至於問,我猜你的問題的正確答案是「從不」。但事實上,你想知道的情況**,你不能使用'[x]'這麼**。 –

回答

17

你不應該擔心性能,除非你的代碼是在緊張的內環,實際上是一個性能問題。相反,使用最能表達你意圖的代碼。有些人喜歡lambda,有些喜歡itemgetter。有時候這只是一個品味問題。

itemgetter更強大,例如,如果你需要同時獲得多個元素。例如:

operator.itemgetter(1,3,5) 

相同:

lambda s: (s[1], s[3], s[5]) 
+5

「itemgetter更強大」?這似乎倒退了;我可以用lambda做很多事情,但我不能用itemgetter做。我想,它可以更緊湊。 – DSM

+0

@DSM:我認爲他在C性能方面意味着強大,而不是靈活性 – jdi

+6

我很肯定Ned意味着它比[]運算符更強大,這是提問者問的。很明顯,它比lambda中的任意Python代碼更強大。 –

9

性能。它可以產生很大的不同。在合適的情況下,你可以使用itemgetter在C級完成一堆東西。

我想起了什麼是更清晰的要求真的取決於你最經常使用,將是非常主觀的

11

有在某些情況下的福利,這是一個很好的例子。

>>> 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,除非你要。例如。列表理解優於使用maplambda

+11

我個人認爲在這些情況下lambda更清晰。什麼是「明確」不是客觀主張。 'itemgetter'和朋友只不過是特別命名的lambda(概念上)。我懷疑那些已經習慣使用lambdas的人(可能是因爲他們做了很多函數式編程)會發現'lambda'更清晰(因爲他們已經知道'lambda'和已知的'thing [index]',所以lambda「只是說明它的意思」,而'itemgetter'需要記住一個額外的名字),而那些不習慣用lambdas思考的人發現'itemgetter'更容易。 – Ben

7

一些程序員理解和使用lambda表達式,但誰也許沒有采取計算機科學與不上明確的概念程序員人口。對於那些程序員itemgetter()可以使你的意圖更清晰。 (我不寫lambda表達式,任何時候我看到一個代碼都需要額外的時間來處理髮生的事情並理解代碼)。

如果你對其他的計算機科學專業的編碼繼續使用lambda表達式,如果他們更舒適。但是,如果您爲更廣泛的受衆編碼,我建議使用itemgetter()

1

要添加到現有的響應,itemgetter是picklable,而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) 
1

隨着性能所提到的,我比較這兩種方法operator.itemgetterlambda和小清單事實證明,通過operator.itemgetter優於10%拉姆達。我個人喜歡itemgetter方法,因爲我主要在排序過程中使用它,並且它變得像我的關鍵字。關於Python 3.6

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 

運行

相關問題