1. ホーム
  2. python

[解決済み] リスト内包とラムダ+フィルタの比較

2022-03-17 11:55:07

質問

たまたま、基本的なフィルタリングの必要性に気がつきました。リストがあり、それを項目の属性でフィルタリングする必要があります。

私のコードは次のようなものでした。

my_list = [x for x in my_list if x.attribute == value]

でも、こう書いた方がいいんじゃないかと思ったんです。

my_list = filter(lambda x: x.attribute == value, my_list)

この方が読みやすいし、パフォーマンスのために必要なら、ラムダを抜いて何かを得ることもできる。

質問ですが、2番目の方法を使う場合の注意点はありますか?パフォーマンスの違いはありますか?私はPythonic Way™を完全に見逃しており、さらに別の方法(ラムダの代わりにitemgetterを使うなど)で行うべきでしょうか?

どのように解決するのですか?

人によって美しさが違うのは不思議なものです。私は、リスト理解のほうが filter + lambda が、使いやすいほうを選んでください。

の使用を遅くする可能性があるのは、次の2つです。 filter .

1つ目は、関数呼び出しのオーバーヘッドです。Pythonの関数を使用するとすぐに(それが def または lambda ) フィルターはリスト内包より遅くなる可能性があります。しかし、その差は歴然としています。

もう1つのオーバーヘッドは、ラムダがスコープ付き変数( value ). これはローカル変数にアクセスするよりも遅く、Python 2.xではリスト内包はローカル変数にしかアクセスしません。Python 3.xを使用している場合、リスト内包は別の関数で実行されます。 value はクロージャを経由するため、この違いは適用されません。

もう一つの選択肢は、リスト内包の代わりにジェネレータを使うことです。

def filterbyvalue(seq, value):
   for el in seq:
       if el.attribute==value: yield el

そしてメインコードでは(読みやすさが本当に重要なところです)、リスト内包とフィルタの両方を、できれば意味のある関数名に置き換えています。