TIL | Python | 리스트 컴프리헨션

이도운·2021년 12월 29일
0

TIL

목록 보기
11/73
post-thumbnail

리스트 컴프리헨션

리스트 컴프리헨션은 조건문과 반복문 성질을 이용해서 리스트를 만드는 것이다. 형태는 아래와 같다.

[ 표현식 for 원소 in 반복 가능한 객체 ]

[ 표현식 for 원소 in 반복 가능한 객체 if문 ]

리스트 컴프리헨션을 사용하지 않고 리스트를 생성한다면 아래와 같을 것이다.

odd_numbers = [ ]
for element in range(1,11):
    if (element % 2) == 1:
        odd_numbers.append(element)

하지만 리스트 컴프리헨션을 사용한다면 이를 단 한줄로 바꿀 수 있다.

list_comprehension = [ element for element in range(1,11) if (element % 2) == 1 ]

이처럼 리스트 컴프리헨션은 자칫 길게 작성해야 하는 리스트 생성문을 짧게 줄여주는 장점이 있다. 따라서 당연한 말이지만 반복문과 조건문으로 생성 가능한 리스트는 컴프리헨션으로 작성이 가능하고 그 반대도 가능하다.

또한 리스트 컴프리헨션은 성능면에서도 기존 반복문과 조건문을 사용하는 것보다 탁월하다. 아래 코드는 timeit 모듈을 이용해 성능을 비교한 코드다.

import timeit

def for_loop():
   num_list = []
   for i in range(1000):
      num_list.append(i)

def list_comprehension():
   num_list = [ i for i in range(1000) ]

if __name__ == "__main__":
   time1 = timeit.Timer("for_loop()", "from __main__ import for_loop")
   print("for loop time = ", time1.timeit(number=1000), "milliseconds")

   time2 = timeit.Timer("list_comprehension()", "from __main__ import list_comprehension")
   print("list_comprehension time = ", time2.timeit(number=1000), "milliseconds")

아래는 상단의 코드의 실행 결과다.

for loop time = 0.062743696 milliseconds
list_comprehension time = 0.024242144999 milliseconds

리스트 컴프리헨션이 for문보다 2배 이상 성능이 좋은 것을 확인할 수 있다.

리스트 컴프리헨션은 백엔드에서 데이터베이스를 조회해서 리스트로 만들 때 많이 사용된다. 또한 성능 개선을 위해서도 사용이 되기도 한다.

하지만 리스트 컴프리헨션이 만능은 아니다. 단점도 존재하는데 구글 파이썬 스타일 가이드에 따르면 간단한 리스트 컴프리헨션은 직관적이고 보기 좋을 수 있으나 반복문과 조건문이 여러 개가 붙는다면 기존의 반복문과 조건문을 보는 것보다 이해하기 어려울 수 있다고 조언한다.

때문에 상황이 간단할 때 리스트 컴프리헨션을 사용하는 것을 권장한다. 상황이 복잡하다면 기존의 반복문과 조건문을 사용하는 것이 오히려 좋을 수 있다. 복잡한 리스트 컴프리헨션은 개발자가 이해하기 힘들기 때문이다.

참고

1. 구글 파이썬 스타일 가이드
https://google.github.io/styleguide/pyguide#273-cons

2. 윤성우 열혈 파이썬 중급편

profile
⌨️ 백엔드개발자 (컴퓨터공학과 졸업)

0개의 댓글