PYTHON · 성능
리스트 vs 제너레이터
리스트와 제너레이터의 메모리/속도 트레이드오프를 비교합니다.
성능중급generatorlist메모리성능
핵심 설명
리스트와 제너레이터의 메모리/속도 트레이드오프를 비교합니다.
Python code
import sys
import time
# 메모리 비교
list_data = [x ** 2 for x in range(1_000_000)]
gen_data = (x ** 2 for x in range(1_000_000))
print("=== 메모리 비교 ===")
print(f"리스트: {sys.getsizeof(list_data):>12,} bytes")
print(f"제너레이터: {sys.getsizeof(gen_data):>8,} bytes")
# 속도 비교: 전체 소비
def time_it(name, func):
start = time.perf_counter()
result = func()
elapsed = time.perf_counter() - start
print(f" {name}: {elapsed:.4f}초 → {result}")
print("\n=== 합계 계산 속도 ===")
time_it("리스트 컴프", lambda: sum([x**2 for x in range(100000)]))
time_it("제너레이터", lambda: sum(x**2 for x in range(100000)))
# 언제 무엇을 사용?
print("\n=== 선택 기준 ===")
guidelines = {
"리스트": ["인덱스 접근 필요", "여러 번 순회", "len() 필요", "슬라이싱"],
"제너레이터": ["한 번만 순회", "대용량 데이터", "메모리 제한", "지연 평가"],
}
for type_name, cases in guidelines.items():
print(f" {type_name}:")
for case in cases:
print(f" - {case}")
# 체이닝 성능
# 각 단계에서 중간 리스트 생성 없이 처리
result = sum(
x for x in (i**2 for i in range(10000))
if x % 3 == 0
)
print(f"\n체이닝 결과: {result}")학습 팁
한 번만 순회하는 경우 제너레이터가 메모리 효율적입니다. sum(), any(), all()에 적합합니다.
주의할 점
제너레이터를 list()로 변환하면 메모리 이점이 사라집니다. 변환 없이 직접 소비하세요.
자주 묻는 질문
리스트 vs 제너레이터란 무엇인가요?
리스트와 제너레이터의 메모리/속도 트레이드오프를 비교합니다.
리스트 vs 제너레이터 학습 시 주의할 점은 무엇인가요?
제너레이터를 list() 로 변환하면 메모리 이점이 사라집니다. 변환 없이 직접 소비하세요.