PHpullh
학습 라이브러리/Python/리스트 vs 제너레이터

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() 로 변환하면 메모리 이점이 사라집니다. 변환 없이 직접 소비하세요.