핵심 요약
파이썬 제너레이터는 yield
키워드를 사용해 함수의 상태를 보존하면서 값을 필요할 때마다 하나씩 생성(lazy evaluation) 하는 반복자(iterator)입니다. 메모리 효율이 뛰어나고, 복잡한 이터레이션이나 데이터 파이프라인, 코루틴(coroutine) 구현에 활용됩니다.
1. 제너레이터 기본 개념
1.1. 정의
- 제너레이터 함수: 함수 내부에
yield
가 포함된 함수. - 제너레이터 객체: 제너레이터 함수를 호출하면 반환되는 객체. 내부적으로
__iter__()
와__next__()
를 구현한 이터레이터입니다[1].
1.2. 동작 방식
- 제너레이터 함수 호출 → 실행되지 않고 제너레이터 객체 반환
next()
(또는__next__()
) 호출 → 함수 바디가yield
까지 실행 →yield
값 반환 → 실행 상태(pause) 저장- 다시
next()
호출 시 중단된 지점부터 재개 - 함수 종료 시
StopIteration
발생
def count_up_to(n):
count = 1
while count <= n:
yield count
count += 1
gen = count_up_to(3)
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
2. 메모리 효율 및 성능 비교
제너레이터는 전체 시퀀스를 메모리에 올리지 않음으로써 대용량 데이터 처리 시 메모리 사용량을 획기적으로 줄입니다[2].
비교 항목 | 리스트 (eager) | 제너레이터 (lazy) |
---|---|---|
생성 코드 | numbers = [i for i in range(1_000_000)] | numbers = (i for i in range(1_000_000)) |
메모리 사용량 | 8,448,728 bytes | 208 bytes |
생성 시간 | 수초 단위 | 0초 단위 |
3. 제너레이터 표현식 (Generator Expression)
- 리스트 컴프리헨션과 유사하나
[]
대신()
사용 ()
안에 표현식을 쓰면 즉시 제너레이터 객체 생성
squares_gen = (x*x for x in range(10))
for val in squares_gen:
print(val)
4. 제너레이터 메서드
메서드 | 설명 |
---|---|
__next__() / next() | 제너레이터를 다음 yield 로 이동시켜 값을 반환 |
send(value) | yield 표현식에 값을 전달하고, 이후 값을 반환 |
throw(type[, value]) | 실행 중인 제너레이터 내부에서 예외를 발생시키고 처리 뒤 다음 yield 값 반환 혹은 종료 |
close() | 내부에서 GeneratorExit 예외를 일으켜 제너레이터 종료종료 시 finally 블록 실행 가능[3] |
5. yield from
을 통한 하위 제너레이터 위임
- 하위 이터러블의 값을 직접 위임(delegation)할 때 사용
for sub in iterable: yield sub
과 동등하나 코드 간결
def subgen():
yield from range(3)
for i in subgen():
print(i) # 0, 1, 2
send()
,throw()
,close()
도 하위 제너레이터에 전달[4].
6. 코루틴(Coroutine) 기초
- PEP 342를 통해
yield
기반으로 양방향 통신 가능 yield
를 통해 호출자 → 제너레이터로 값 전송(send
)
def simple_coro():
print("Started")
x = yield
print("Received:", x)
coro = simple_coro()
next(coro) # Started
coro.send(42) # Received: 42
- 제너레이터를 활용한 단일 스레드 동시성(concurrency) 구현 기초[5].
7. 활용 사례
- 대용량 파일 처리: 한 줄씩 처리하며 메모리 사용 최소화
- 무한 시퀀스 생성: 예) 피보나치, 무한 카운터
- 데이터 파이프라인: 생성→변환→소비 과정을 lazy하게 연결
- 코루틴/이벤트 루프:
asyncio
이전의 간단한 비동기(코루틴) 구현
8. 역사 및 표준
- PEP 255 (2001): 제너레이터 및
yield
도입[6] - PEP 342 (2005): 향상된 제너레이터,
send
/throw
/close
추가 (코루틴 지원)[5]
9. 주의사항 및 팁
yield
함수 안에서return
하면StopIteration
발생send()
사용 전 반드시next()
로 제너레이터 시작- 복잡한 예외 처리는
throw()
대신 일반 예외 처리 권장 yield from
이 없는 버전(Python 3.2 이전)에서는 수동for
루프 필요
파이썬 제너레이터는 메모리 효율, 코드 간결성, 유연한 흐름 제어를 제공하여 다양한 반복 처리와 비동기 패턴 구현에 필수적인 도구입니다. 앞으로의 파이썬 개발에서 제너레이터를 적극 활용해 보십시오.
출처
[1] 파이썬 코딩 도장: 40.1 제너레이터와 yield 알아보기 https://dojang.io/mod/page/view.php?id=2412
[2] Optimizing Python: Understanding Generator Mechanics … – Pybites https://pybit.es/articles/generator-mechanics-expressions-and-efficiency/
[3] 6. 표현식 — Python 3.15.0a0 문서 https://docs.python.org/ko/dev/reference/expressions.html
[4] What is yield from
? – Python discussion forum https://discuss.python.org/t/what-is-yield-from/40197
[5] python 코루틴(coroutine) – iterator, generator, asyncio, async, await … https://velog.io/@qlgks1/python-%EC%BD%94%EB%A3%A8%ED%8B%B4coroutine-iterator-generator-asyncio-async-await-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%BD%94%EB%A3%A8%ED%8B%B4-2
[6] PEP 255 – Simple Generators | peps.python.org https://peps.python.org/pep-0255/
[7] Python Generators (With Examples) – Programiz https://www.programiz.com/python-programming/generator
[8] Python Generators: Boosting Performance and Simplifying Code https://www.datacamp.com/tutorial/python-generators
[9] [python] yield from – 코딩장이 https://itholic.github.io/python-yield-from/
[10] What is generator.throw() good for? – Stack Overflow https://stackoverflow.com/questions/11485591/what-is-generator-throw-good-for
[11] Do generators really decrease memory usage? : r/learnpython – Reddit https://www.reddit.com/r/learnpython/comments/z4tlak/do_generators_really_decrease_memory_usage/
[12] [Python] 예제를 통해 알아보는 파이썬 yield 활용법, 메모리 사용량 … https://dykm.tistory.com/54
[13] [Python] generators – velog https://velog.io/@choich_0807/Python-generators
[14] 파이썬 제너레이터(generator) 와 yield 사용법 : 네이버 블로그 https://blog.naver.com/nkj2001/222706736306
[15] [Python] yield
완벽 가이드: 효율적인 데이터 처리와 제너레이터 사용법 https://0171-cloud.tistory.com/8
[16] [Python] 제너레이터(Generator) – Release notes for – LEE CHANWOO https://leechanwoo-kor.github.io/python/geneartor/
[17] 파이썬의 yield 키워드와 제너레이터(generator) https://www.daleseo.com/python-yield/
[18] 파이썬 클린 코드 – 7장 (제너레이터) – 잡동사니 블로그 https://monsterkos.tistory.com/42
[19] 39. Generator(제네레이터) – 파이썬 – 기본을 갈고 닦자! – 위키독스 https://wikidocs.net/16069
답글 남기기