💻 프로그래밍/Python

filter() + lambda VS list comprehension

피트웨어 제이 (FitwareJay) 2020. 8. 10. 19:39

안녕하세요! 운동하는 개발자 Jay입니다!!

오늘은 list의 내용을 필터링해서 새로운 list로 반환하는 두 가지 방법에 대해서 알아보겠습니다!

 

1. filter, lambda 함수를 이용


filter함수와 lambda 함수로 list를 입력받아 조건으로 필터링하는 간단한 코드를 보겠습니다.

# python2.x
 
test_list = [12345]
filter(lambda a : a > 2, test_list)
 
 
 
filter(lambda 값 : 조건문, 리스트)

문법은 굉장히 간단합니다. lambda 함수를 정의하고 filter로 감싸주면 됩니다. 결과를 확인해 보겠습니다.

 

python2에서 실행한 결과

오 상당히 쉽습니다. 하지만 이렇게 쉽게 끝나면 글을 쓰지 않았겠죠?

filter함수의 return값이 python3에서는 또 다릅니다.

(최근 프로젝트 python 버전을 py2 -> py3 버전업 하는 일을 했어서...ㅋㅋㅋ)

 

python3에서 실행한 결과

python3에서는 filter함수의 return값이 filter object입니다. 그래서 filter로 반환한 값을 list로 받고 싶으면 list()로 다시 한번 더 감싸줍니다! 그래서 이 이야기를 왜 하냐고요?! 이제 바로 나옵니다 👇

 

 

2. python 개발자면 pythonic 하게 list comprehension을 쓰자!


검색 중 우연히 알게 되었는데, list comprehension이라는 게 있더라고요! 사실 이미 사용하고 있었고 알고 있던 내용이지만, 개념적(?)으로 그렇게 잘 알고 있진 않았네요 ㅎㅎ (오... 이게 list comprehension 이었구나...ㅋㅋㅋ)

test_list = [12345]
[a for a in test_list if a > 2]
 
 
 
[ (변수의 값) for (변수) in (리스트(순회할 수 있는 값))]

위처럼 작성하는 방법입니다! 이런 문법을 바로 list comprehension 이라고 합니다!! 이렇게 작성하면 filter(), lambda를 사용하지 않고 필터링된 리스트를 반환할 수 있습니다. 

 

list comprehension으로 작성하는 게(filter(), lambda와 동일한 결과를 반환할 때) 더 pythonic 하고 성능도 좋은 방법이라고 합니다.

한번 속도 비교를 해볼까요?

import timeit
 
test_list = [a for a in range(010000)]
 
# filter, lambda 사용
start_time = timeit.default_timer()
filter_list = list(filter(lambda f: f % 2, test_list))
terminate_time = timeit.default_timer()
print(f'{terminate_time - start_time:.5f}초 걸렸습니다.')
 
# list comprehension
start_time = timeit.default_timer()
comp_list = [f for f in test_list if f % 2]
terminate_time = timeit.default_timer()
print(f'{terminate_time - start_time:.5f}초 걸렸습니다.')
 
 
 

10000개 숫자를 가지고 있는 list를 순회하며, 홀수인 값들만 다시 list로 반환하는 코드입니다.

결과를 한번 확인해보겠습니다.

 

2배 이상 차이나는 결과

속도를 보면 list comprehension으로 작성한 코드가 2배 이상 빠르네요 ㅎㅎ 이런 이유들로 인해서 list comprehension을 사용하는 게 좀 더 좋습니다.

 

다만 프로젝트에서 filter()lambda 사용을 선호하고 있거나, 굳이 저 정도 속도 차이를 무시해도 되는 경우라면,  list comprehension을 사용하지 않아도 되겠네요. (그래.... 도 웬만하면 list comprehension을 사용하는 게 좋을 것 같네요ㅋㅋㅋ)