42

ここで、より一般的な質問があります: Python で組み込みモジュールを使用する必要があるのはどのような状況ですか?operator

operator.itemgetter(x)一番上の回答は、おそらく よりも「きれい」であると主張していlambda a: a[x]ます。私はその逆だと感じています。

パフォーマンスなど、他にメリットはありますか?

4

7 に答える 7

27

コードがタイトな内部ループにあり、実際にパフォーマンスの問題でない限り、パフォーマンスについて心配する必要はありません。代わりに、意図を最もよく表すコードを使用してください。ラムダが好きな人もいれば、アイテムゲッターが好きな人もいます。時にはそれは単なる好みの問題です。

itemgetterたとえば、一度に多数の要素を取得する必要がある場合は、より強力です。例えば:

operator.itemgetter(1,3,5)

以下と同じです:

lambda s: (s[1], s[3], s[5])
于 2012-07-02T02:27:27.843 に答える
17

いくつかの状況では利点があります。ここに良い例があります。

>>> 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ます。

于 2012-07-02T02:30:16.693 に答える
15

パフォーマンス。それは大きな違いを生む可能性があります。適切な状況では、itemgetter を使用して C レベルで多くのことを実行できます。

どちらがより明確であるかという主張は、どちらを最も頻繁に使用するかによって異なり、非常に主観的だと思います

于 2012-07-02T02:30:11.033 に答える
8

パフォーマンスが言及されたので、私は両方の方法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

Python 3.6 で実行

于 2018-01-22T17:40:55.400 に答える
5

一部のプログラマーはラムダを理解して使用していますが、おそらくコンピューター サイエンスを学んでおらず、概念を明確に理解していないプログラマーもいます。それらのプログラマーitemgetter()は、あなたの意図をより明確にすることができます。(私はラムダを書きません。コードでラムダを見るたびに、何が起こっているのかを処理してコードを理解するのに少し余分な時間がかかります)。

他のコンピューター サイエンスの専門家のためにコーディングしている場合は、ラムダ式を使用してください。ただし、より広い対象者向けにコーディングしている場合。を使用することをお勧めしitemgetter()ます。

于 2012-07-02T04:16:10.320 に答える