파이썬 제너레이터 : 장차 크게 될 녀석

“제너레이터”메모리 효율적인 방식으로 반복자를 생성하기 위한 강력한 도구입니다. 제너레이터를 만드는 방법은 2가지 입니다. 1. 함수의 yield 문 사용. 2. 컴프리핸션 사용

대부분의 블로그에서 제너레이터의 예제는 피보나치 수열 문제를 예로 들어줍니다. 하지만 이런 수학 문제 예제는 제너레이터를 어떻게 활용해야 하는지에 대한 감을 떨어뜨립니다…

저는 피보나치보다는 데이터 처리에서 제너레이터가 어떻게 쓰이는 예제를 가져왔습니다. 아래 yield문을 사용한 제너레이터 사용법 섹션 글을 확인해주세요

제너레이터 개념은 장차 코루틴, 비동기 까지 이어질 수 있는 개념 입니다. 꼭 정리합시다~!

제너레이터 생성법

yield문 사용

함수의 반환을 return이 아니라 yield문을 사용하여 제너레이터를 만들 수 있습니다.

def simple_gen():
    yield 1
    yield 2
    yield 3

gen = simple_gen()
print(next(gen))  # 결과: 1
print(next(gen))  # 결과: 2
print(next(gen))  # 결과: 3

yield from 사용

yield from은 반복으로 yield 수행하겠다’를 의미합니다.

def simple_gen():
    yield from range(1,4)

gen = simple_gen()
print(next(gen))  # 결과: 1
print(next(gen))  # 결과: 2
print(next(gen))  # 결과: 3

컴프리핸션 사용

튜플의 형태에서 컴프리핸션을 사용하여도 제너레이터를 만들 수 있습니다

chars = 'ABCD'
tuple_gen = (ord(s) for s in chars)
# print(list(tuple_gen))  # list로도 변환 가능
print(type(tuple_gen))  # <class 'generator'>
print(next(tuple_gen))  # 65
print(next(tuple_gen))  # 66
print(next(tuple_gen))  # 67
print(next(tuple_gen))  # 68
# print(next(tuple_g)) # Raise StopIteration error

제너레이터 활용법

아래 예제는 csv를 읽어서 데이터를 처리하는 예입니다. 이 예에서는 전체 데이터세트를 메모리에 로드하지 않고 대규모 데이터세트를 효율적으로 처리하기 위해 제너레이터를 사용하는 방법을 보여줍니다.

한 번에 한 행씩 읽고 생성하므로 메모리의 효율이 필요한 대용량 데이터 처리 시나리오에 적합합니다.

emplyees.csv

Name,Age,Department
Alice,28,Engineering
Bob,35,Marketing
Charlie,42,Human Resources
David,31,Engineering
Eva,29,Marketing

제너레이터를 사용한 데이터처리 코드

import csv
from collections import namedtuple

def read_employee_data(file_path):
    with open(file_path, newline='') as csvfile:
        csv_reader = csv.reader(csvfile)
        headers = next(csv_reader)  # 첫 행에서 해더 정보 추출
        Employee = namedtuple('Employee', headers)

        for row in csv_reader:
            yield Employee(*row)

# employee 데이터를 처리하기 위한 제너레이터 사용
file_path = 'employees.csv'
employee_generator = read_employee_data(file_path)

print("Employee Information:")
for employee in employee_generator:
    print(f"Name: {employee.Name}, Age: {employee.Age}, Department: {employee.Department}")

Leave a Comment

목차