728x90
제네레이터 (Generator ) 란 ?
- 이터레이터 (Iterator)를 생성하는 특별한 함수 또는 표현식이다.
- 하나씩 생성하여 반환하며, 호출할 때마다 이전 상태를 유지한다.
- 이로 인해서 메모리에서 효율적으로 처리하기 때문에 대용량 데이터 처리에 유리하다.
제네레이터 예시
일반 함수 예시
def index_words(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == ' ':
result.append(index + 1)
return result
address = '컴퓨터(영어: Computer, 문화어: 콤퓨터, 순화어:전산기)는 진공관'
result = index_words(address)
print(result[:10]) # [0, 8, 18, 23, 28. 38]
제네레이터를 사용한 예시
- 제네레이터의 기본적인 동작 원리는
next()
내장 메서드를 실행할 때,next()
실행 횟수의yield
가 실행된다는 것이다.- 예를 들어 아래에서 최초
yield
를 호출할 때는 최초 0번째yield
가 있는 0를 리턴한다. - 다음으로는 반복문 안에 있는 첫 번째
yield
인 8를 리턴한다.- 여기서 for 문으로 인해 N-2 개의
yield
가 더 생성된다.
- 여기서 for 문으로 인해 N-2 개의
- 예를 들어 아래에서 최초
def index_words_iter(text):
if text:
yield 0
for index, letter in enumerate(text):
if letter == ' ':
yield index + 1
it = index_words_iter(address)
print(next(it)) # 0
print(next(it)) # 8
제네레이터의 메모리 효율성
- 제네레이터는 값을 미리 생성하지 않고 필요할 때마다 생성하기 때문에 메모리 효율적이다.
large_list
는 메모리에 100만 개의 제곱 값을 저장합니다.large_gen
은 메모리에 값을 저장하지 않고 필요할 때 계산합니다.()
에 이터레이션을 추가하면 제네레이터로 생성된다.
# 리스트 컴프리헨션
large_list = [x**2 for x in range(1000000)]
# 제네레이터 표현식
large_gen = (x**2 for x in range(1000000))
제네레이터 슬라이싱
itertools
의islice
를 활용하면 슬라이싱이 가능하다.
def index_file(handle):
offset = 0
for line in handle:
if line:
yield offset
for letter in line:
offset += 1
if letter == ' ':
yield offset
import itertools
with open('address.txt', 'r', encoding='utf-8') as f:
it = index_file(f) # 제네레이터 객체 생성
results = itertools.islice(it, 0, 10) # 처음 10개의 값을 슬라이싱
print(list(results))
728x90
'Programming Language > Python' 카테고리의 다른 글
BETTER WAY 33 - yield from 를 사용해 여러 제너레이터를 합성해라 (0) | 2024.12.12 |
---|---|
BETTER WAY 31 - 인자에 대해 이터레이션할 때는 방어적이 돼라 (0) | 2024.12.03 |
BETTER WAY 26 - functools.wrap 사용해 함수 데코레이터를 정의하라 (0) | 2024.11.26 |
BETTER WAY 21 - 변수 영역과 클로저의 상호작용 방식을 이해하라 (0) | 2024.11.25 |
BETTER WAY 15 - 딕셔너리 삽입 순서에 의존할 떄는 조심하라 (2) | 2024.11.11 |