I have a list that I want to filter by an attribute of the items.
Which of the following is preferred (readability, performance, other reasons)?
xs = [x for x in xs if x.attribute == value]
xs = filter(lambda x: x.attribute == value, xs)
filterfunctional-programminglambdalistpython
I have a list that I want to filter by an attribute of the items.
Which of the following is preferred (readability, performance, other reasons)?
xs = [x for x in xs if x.attribute == value]
xs = filter(lambda x: x.attribute == value, xs)
Best Answer
It is strange how much beauty varies for different people. I find the list comprehension much clearer than
filter
+lambda
, but use whichever you find easier.There are two things that may slow down your use of
filter
.The first is the function call overhead: as soon as you use a Python function (whether created by
def
orlambda
) it is likely that filter will be slower than the list comprehension. It almost certainly is not enough to matter, and you shouldn't think much about performance until you've timed your code and found it to be a bottleneck, but the difference will be there.The other overhead that might apply is that the lambda is being forced to access a scoped variable (
value
). That is slower than accessing a local variable and in Python 2.x the list comprehension only accesses local variables. If you are using Python 3.x the list comprehension runs in a separate function so it will also be accessingvalue
through a closure and this difference won't apply.The other option to consider is to use a generator instead of a list comprehension:
Then in your main code (which is where readability really matters) you've replaced both list comprehension and filter with a hopefully meaningful function name.