먼저 generator에 대해 작성하기에 앞서, 참고해서 공부하고 있는 사이트에서 이터레이터를 언급하고 있다.
프로그래머가 컨테이너, 특히 목록을 탐색할 수 있게 해주는 객체
iterable(반복가능한 객체)
, 반복자(Iterator)
, 반복(Iteration)
이 나오는데, 이전 게시물에서 한 번 정리를 했었다. https://velog.io/@heyggun/python-이터레이터-iterator-iter-getitem
무튼 짧게 정리하고 가자면, Iterable(순회 가능한 객체, 반복 가능한 객체) 는 iterator를 반환하고 인덱스를 취할 수 있는__iter__
, __getitem__
메소드가 정의된 파이썬의 객체이다.
iterator를 제공할 수 있는 객체라고 보면된다.
__next__
메소드가 정의된 객체이다.그렇다면 본격적으로 제너레이터에 대해서 알아보자.
Iterator
이면서 동시에 Iterable
한객체라는 것이다.__iter__
와 __next__
메서드를 내부적으로 구현하여 반복 가능한 객체로 동작할 수 있게 만들어 졌기 때문이다. 간단한 예로 0부터 시작해 무한히 증가하는 값을 생성하는 제너레이터 함수 코드를 보자면
def infinite_generator():
i = 0
while True:
yield i
i+=1
# 제너레이터 객체 생성
gen_obj = infinite_generator()
# 반복 가능한지 확인
print(isinstance(gen_obj, Iterable)) # output True
# 값을 얻기 위해 반복
print(next(gen_obj)) # output 0
print(next(gen_obj)) # output 1
print(next(gen_obj)) # output 2
따라서 모든 generator는 iterator로 iterable 순서가 지정된다는 것은
제너레이터는 반복가능한 객체이며 내부에서 __iter__
, __next__
를 구현하여 순회가능하고
next()
함수로 값을 생성한다는 의미이다.
제너레이터는 모든 결과물들을 메모리에 저장하지 않으면서 동시에 많은 양의 결과 셋을 계산해야 할때 유용하다.
[1] 로그 파일을 읽어오고 특정 조건을 만족하는 로그를 출력할 때 사용
def read_logs(log_file_path):
with open(log_file_path, 'r') as file:
for line in file:
yield line.strip()
def filter_logs(logs, keyword):
for log in logs:
if keyword in log:
yield log
def process_logs(logs):
for log in logs:
yield f"Processed log: {log}"
# 로그 파일 경로 지정
log_file_path = 'example.log'
# 로그 파일을 읽어오는 제너레이터 생성
logs_generator = rea_logs(log_file_pth)
# 특정 키워드를 포함하는 로그를 필터링하는 제너레이터 생성
filtered_logs_generator = filter_logs(logs_generator, keyword='error')
# 로그를 가공하는 제너레이터 생성
process_logs_generator = process_logs(filtered_logs_generator)
# 최종적으로 제너레이터를 사용하여 출력
for processed_log in process_logs_generator:
print(processed)log)
[2] 데이터베이스에서 대량의 데이터를 읽어와서 처리할 때 사용
import random
def generator_large_data(size):
for _ in range(size):
yield random.randint(1, 1000)
def process_large_data(data):
for value in data:
yield f"Processed data : {value}"
# 대량의 데이터를 생성하는 제너레이터
large_data_generator = generator_large_data(1000000)
# 데이터를 가공하는 제너레이터 생성
processed_data_generator = process_large_data(large_data_generator)
# 최종적으로 제너레이터를 사용해서 출력(상위 5개)
for _ in range(5):
processed_data = next(processed_data_generator)
print(processed_data)
[1] https://ddanggle.gitbooks.io/interpy-kr/content/ch3-generators.html\
A generator in Python is a special type of iterator geometry dash, but with its own distinct advantages and use cases. Generators allow you to iterate over data lazily, meaning that instead of loading the entire dataset into memory at once, you can generate each item on the fly.