오늘은 지난 글에 이어 효율적인 데이터 처리 기술중 하나인 제너레이터에 대하여 알아보도록 하겠습니다.
1. 제너레이터란?(generator)
제네레이터(generator)는 이터레이터(iterator)를 생성해주는 기능을 제공하는 함수입니다. 구현은 return 대신 yield 키워드를 사용하는 방법과 제너레이터 표현식을 사용하는 방법이 있습니다. 그럼 우리는 굳이 제너레이터를 사용할까요? 특징을 보면서 이해해보도록 하겠습니다.
제너레이터의 특징은 다음과 같습니다.
- 함수 내에서 yield 문을 사용하여 값을 반환하며, 함수의 실행 상태가 일시적으로 중지되고 재개
- 제네레이터는 필요한 값을 요청할 때만 생성하고 메모리에 저장하지 않음
- 대용량 데이터도 처리할 수 있고, 메모리 효율적으로 작동
- 이터레이터와 달리 __iter__()와 __next__() 메서드를 직접 구현할 필요 없이,
yield 문을 사용하여 제네레이터를 생성 가능
제너레이터를 사용하는 이유는 제너레이터가 이터레이터에 비해 메모리 사용량이 효율적이기 때문입니다.
일단 yield를 알아 보기전에 일단 제너레이터 표현식부터 알아보도록 하겠습니다.
2. 제너레이터 표현식이란?란?(generator expression)
제너레이터 표현식(generator expression)은 파이썬에서 리스트 컴프리헨션과 비슷한 구문으로, 간단하게 제너레이터를 생성하는 방법입니다. 제너레이터 표현식은 ( )로 감싸진 표현식으로, 리스트 컴프리헨션과 유사한 문법을 사용합니다. 그러나 리스트 컴프리헨션과 달리 제너레이터 표현식은 리스트를 메모리에 모두 로드하지 않고 필요한 값을 순차적으로 생성하여 반환합니다.
# 리스트 컴프리헨션
squares_list = [x ** 2 for x in range(10)]
print(squares_list) # 출력: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 제너레이터 표현식
squares_generator = (x ** 2 for x in range(10))
print(squares_generator) # 출력: <generator object <genexpr> at 0x...>
# 제너레이터는 리스트처럼 한 번에 모든 값을 가지고 있지 않습니다.
# 대신 필요한 값이 요청될 때마다 값을 생성합니다.
print(next(squares_generator)) # 출력: 0
print(next(squares_generator)) # 출력: 1
print(next(squares_generator)) # 출력: 4
# ...
위 예시에서 squares_list는 리스트 컴프리헨션을 사용하여 0부터 9까지의 숫자의 제곱을 계산하여 리스트로 반환합니다. 반면, squares_generator는 제너레이터 표현식을 사용하여 0부터 9까지의 숫자의 제곱을 필요할 때마다 생성합니다.
그렇기에 제너레이터는 이터러블(iterable) 객체에 비해 메모리를 더 효율적으로 사용합니다! 제너레이터를 사용하는 이유기도 합니다. 자 그럼 앞서 말씀드린 yield를 사용한 제너레이터 생성 객체 생성방법을 보여드리도록 하겠습니다.
yield를 사용한 방식을 뒤에 설명 드린이유는 앞에 예시 코드와 동일한 데이터를 yield로 보여드리면 좀 더 이해하기 쉬울 것 같아서 뒤로 옮겨놓았습니다.
# 제너레이터 함수
def squares_generator():
for x in range(10):
yield x ** 2
# 제너레이터 함수에서 제너레이터 객체를 생성합니다.
gen = squares_generator()
# 제너레이터 함수는 필요한 값만 생성하여 메모리를 효율적으로 관리합니다.
# for 루프를 사용하여 제너레이터 함수에서 생성된 값을 순회합니다.
for value in gen:
print(value)
return 대신 yield 를 사용함으로써 for 루프 순회 시 값을 생성하여 출력합니다.
yield 에 대해선 추후 다른 글로 한번더 설명 드리도록 하겠습니다! 한번에 너무 많은 내용을 이해하려고 하면 어려우니!
오늘은 제너레이터가 무엇이고 왜 사용하는지 그리고 구현 방법은 어떤 것이 있는지까지를 중점으로
이해하시면 좋을 것 같습니다!
'파이썬(python) 기본' 카테고리의 다른 글
파이썬 예외: 파이썬의 예외 처리 메커니즘 (0) | 2023.08.07 |
---|---|
파이썬 기초: 모듈과 패키지 개념 (0) | 2023.08.07 |
파이썬 데이터 처리 : 이터러블(iterable)과 이터레이터(iterator) (0) | 2023.08.02 |
파이썬 객체 지향 프로그래밍: 클래스(Class) 생성자와 인스턴스 변수 (0) | 2023.07.28 |
파이썬 함수 4편: *args, **kwargs , 가변 인자 처리 방법 (0) | 2023.07.25 |