파이썬/기초 프로그래밍

리스트 컴프리헨션, 어디까지 써야 똑똑한 걸까?

Data Jun 2025. 6. 22. 14:41

파이썬의 리스트 컴프리헨션(List Comprehension)은
코드를 짧고 간결하게 만들어주는 강력한 도구입니다.

 

하지만! 모든 상황에 써야 하는 건 아닙니다.
특히 아래와 같은 상황에서는 오히려 가독성과 성능 모두 손해일 수 있습니다.

 

1. 리스트 컴프리헨션이란?

기본적인 형태는 아래와 같습니다.

squares = [x**2 for x in range(10)]

이 코드는 0~9까지의 제곱을 구해 리스트로 만듭니다.

 

간단하고 보기 좋죠.

 

표현식이 너무 많다면? (가독성 주의!)

리스트 컴프리헨션은 다음과 같이 조건식이나 중첩 루프도 지원합니다.

[x*y for x in range(3) for y in range(3) if x != y]

하지만...

# ❌ 가독성 매우 나쁜 예
[result for x in range(10) for y in range(10) if x != y if x + y > 5 if x % 2 == 0]

이처럼 표현식이 2개 이상 겹치기 시작하면,
오히려 코드를 해석하기 어렵고, 디버깅도 힘들어집니다.

 

2. 리스트 컴프리헨션, 이런 경우는 피하자

상황 이유
조건이 2~3개 이상 중첩되는 경우 가독성 저하
루프 여러 겹으로 중첩되는 경우 흐름 파악 어려움
코드 길이가 한 줄 이상 넘어가는 경우 줄이 짧다고 좋은 코드가 아님

이럴 땐 for문이나 별도의 함수로 분리하세요.

 

3. 제너레이터로 대체하면 더 효율적인 경우도 있다!

리스트 컴프리헨션은 항상 리스트 전체를 메모리에 저장합니다.
하지만 파이썬에는 **메모리 효율이 좋은 제너레이터(generator)**도 있죠.

 

1️⃣ 예: 리스트 컴프리헨션

squares = [x**2 for x in range(1_000_000)]

→ 이 코드는 100만 개의 제곱값을 한 번에 메모리에 저장합니다.
메모리 사용량이 크고, 필요 없는 경우도 많죠.

 

2️⃣ 제너레이터 표현식 (Generator Expression)

squares = (x**2 for x in range(1_000_000))

→ 이 코드는 필요할 때마다 하나씩 꺼내는 구조입니다.
👉 지연 평가(lazy evaluation) 덕분에 훨씬 효율적입니다.

 

4. 언제 제너레이터가 더 나을까?

상황 추천 방식
값을 한 번만 순회할 때 제너레이터
리스트 전체가 필요 없을 때 제너레이터
대용량 데이터 처리 제너레이터
값 저장이 필요한 경우 리스트 컴프리헨선

 

 

 

정리하면

 

✔ 리스트 컴프리헨션은:

  • 표현이 간단할 때만 사용
  • 두 개 이상의 조건/루프가 겹치면 오히려 독이 됨
  • 복잡해지면 for 문이 더 낫다

✔ 제너레이터 표현식은:

  • 메모리 효율이 중요할 때 강력함
  • 순차 처리 / 스트리밍 데이터에 적합
  • 리스트가 꼭 필요하지 않을 때 대체 가능

 

 

코드가 짧다고 해서 좋은 건 아닙니다.

읽기 쉬운 코드, 의도가 명확한 코드, 효율적인 코드 이 세 가지 균형이 진짜 실력입니다.

 

리스트 컴프리헨션도 좋지만, 상황에 따라 제너레이터전통적인 for문을 잘 골라 써보세요!