파이썬의 리스트 컴프리헨션(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문을 잘 골라 써보세요!
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 리스트 컴프리헨션과 제너레이터의 메모리 사용 차이! (0) | 2025.06.22 |
|---|---|
| 제너레이터 vs 이터레이터, 쉽게 이해하기 (0) | 2025.06.22 |
| 파이썬 inspect 모듈, 쉽게 이해하기 (1) | 2025.06.22 |
| "로직"이란 정확히 무슨 뜻일까? (0) | 2025.06.10 |
| re.sub(패턴, lambda, 문자열) — 조건부 치환의 강력한 도구! (0) | 2025.06.07 |