티스토리 뷰

개발/파이썬

리스트 내포 vs. 람다 + 필터

맨날치킨 2022. 12. 25. 16:05
반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

List comprehension vs. lambda + filter

리스트 내포 vs. 람다 + 필터

 문제 내용 

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)

 

 

 높은 점수를 받은 Solution 

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.

이상하게도 서로 다른 사람들에게서 아름다움의 정도가 얼마나 다른지 놀라운 것입니다. 저는 리스트 내포를 filter+lambda보다 더 명확하게 생각하지만, 당신이 더 쉽게 생각하는 것을 사용하세요.

 

There are two things that may slow down your use of filter.

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.

첫 번째는 함수 호출 오버헤드입니다: def 또는 lambda로 생성된 Python 함수를 사용하면 filter가 리스트 내포보다 느릴 가능성이 높습니다. 거의 중요하지 않을 것입니다. 코드를 타이밍하고 병목현상이 발견되면 성능에 대해 많이 생각하지 않아도 됩니다. 하지만 차이가 있을 것입니다.

 

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.

다른 오버헤드는 람다가 스코프 변수(value)에 접근해야 한다는 것입니다. 이는 로컬 변수에 접근하는 것보다 느립니다. Python 2.x에서 리스트 내포는 로컬 변수에만 접근합니다. Python 3.x에서는 리스트 내포가 별도의 함수에서 실행되므로 이러한 차이는 적용되지 않습니다.

 

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.

그런 다음 메인 코드에서 (가독성이 정말 중요한 곳) 리스트 컴프리헨션과 필터를 의미있는 함수 이름으로 교체했습니다.

 

 

 

 가장 최근 달린 Solution 

In terms of performance, it depends.

성능 측면에서는, 이것은 달라집니다.

 

filter does not return a list but an iterator, if you need the list 'immediately' filtering and list conversion it is slower than with list comprehension by about 40% for very large lists (>1M). Up to 100K elements, there is almost no difference, from 600K onwards there starts to be differences.

filter는 리스트가 아니라 반복자를 반환하기 때문에, 리스트 '즉시' 필터링 및 리스트 변환은 매우 큰 리스트 (>1M)의 경우 리스트 내포보다 약 40% 느립니다. 10만 개 이하의 항목의 경우 거의 차이가 없으며, 60만 개 이상부터 차이가 나기 시작합니다.

 

If you don't convert to a list, filter is practically instantaneous.

리스트로 변환하지 않으면 filter는 실제로 즉시 실행됩니다.

 

More info at: https://blog.finxter.com/python-lists-filter-vs-list-comprehension-which-is-faster/

자세한 정보: https://blog.finxter.com/python-lists-filter-vs-list-comprehension-which-is-faster/

 

 

 

출처 : https://stackoverflow.com/questions/3013449/list-comprehension-vs-lambda-filter

반응형
댓글
공지사항
최근에 올라온 글