アイテムの属性でフィルタリングしたいリストがあります。
次のどれが優先されますか (読みやすさ、パフォーマンス、その他の理由)?
xs = [x for x in xs if x.attribute == value]
xs = filter(lambda x: x.attribute == value, xs)
ベストアンサー1
人によって美しさがこんなにも違うのは不思議です。リストの理解はfilter
+よりもはるかに明確だと思いますlambda
が、どちらでも使いやすい方を使用してください。
の使用速度を低下させる可能性があるものが 2 つありますfilter
。
1 つ目は、関数呼び出しのオーバーヘッドです。Python 関数 ( または によって作成されたものdef
)を使用するとすぐにlambda
、filter はリストの内包表記よりも遅くなる可能性があります。これは問題になるほどではないことはほぼ確実であり、コードの時間を計測してボトルネックであることがわかるまではパフォーマンスについてあまり考えるべきではありませんが、違いはあります。
適用される可能性があるその他のオーバーヘッドは、ラムダがスコープ付き変数 ( value
) にアクセスすることを強制されることです。これはローカル変数にアクセスするよりも遅く、Python 2.x ではリストの内包表記はローカル変数にのみアクセスします。Python 3.x を使用している場合、リストの内包表記は別の関数で実行されるため、value
クロージャを介してアクセスすることになり、この違いは適用されません。
検討すべきもう一つのオプションは、リストの内包表記の代わりにジェネレータを使用することです。
def filterbyvalue(seq, value):
for el in seq:
if el.attribute==value: yield el
次に、メイン コード (読みやすさが本当に重要になる部分) で、リストの理解とフィルターの両方を、意味のある関数名に置き換えます。