List comprehension vs. lambda + filter

前端 未结 14 2152
挽巷
挽巷 2020-11-22 02:01

I happened to find myself having a basic filtering need: I have a list and I have to filter it by an attribute of the items.

My code looked like this:



        
14条回答
  •  误落风尘
    2020-11-22 02:58

    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 or lambda) 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 accessing value through a closure and this difference won't apply.

    The other option to consider is to use a generator instead of a list comprehension:

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

    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.

提交回复
热议问题