ここで、より一般的な質問があります: Python で組み込みモジュールを使用する必要があるのはどのような状況ですか?operator
operator.itemgetter(x)
一番上の回答は、おそらく よりも「きれい」であると主張していlambda a: a[x]
ます。私はその逆だと感じています。
パフォーマンスなど、他にメリットはありますか?
ここで、より一般的な質問があります: Python で組み込みモジュールを使用する必要があるのはどのような状況ですか?operator
operator.itemgetter(x)
一番上の回答は、おそらく よりも「きれい」であると主張していlambda a: a[x]
ます。私はその逆だと感じています。
パフォーマンスなど、他にメリットはありますか?
コードがタイトな内部ループにあり、実際にパフォーマンスの問題でない限り、パフォーマンスについて心配する必要はありません。代わりに、意図を最もよく表すコードを使用してください。ラムダが好きな人もいれば、アイテムゲッターが好きな人もいます。時にはそれは単なる好みの問題です。
itemgetter
たとえば、一度に多数の要素を取得する必要がある場合は、より強力です。例えば:
operator.itemgetter(1,3,5)
以下と同じです:
lambda s: (s[1], s[3], s[5])
いくつかの状況では利点があります。ここに良い例があります。
>>> 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)]
a を使用するlambda
と明確ではなく、遅くなるため、必要lambda
がない限り使用しないことをお勧めします。例えば。リスト内包表記は、で使用map
するよりも優先されlambda
ます。
パフォーマンス。それは大きな違いを生む可能性があります。適切な状況では、itemgetter を使用して C レベルで多くのことを実行できます。
どちらがより明確であるかという主張は、どちらを最も頻繁に使用するかによって異なり、非常に主観的だと思います
パフォーマンスが言及されたので、私は両方の方法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
一部のプログラマーはラムダを理解して使用していますが、おそらくコンピューター サイエンスを学んでおらず、概念を明確に理解していないプログラマーもいます。それらのプログラマーitemgetter()
は、あなたの意図をより明確にすることができます。(私はラムダを書きません。コードでラムダを見るたびに、何が起こっているのかを処理してコードを理解するのに少し余分な時間がかかります)。
他のコンピューター サイエンスの専門家のためにコーディングしている場合は、ラムダ式を使用してください。ただし、より広い対象者向けにコーディングしている場合。を使用することをお勧めしitemgetter()
ます。