제너레이터는 딥러닝에서 학습용 데이터의 Batch를 만들 때 많이 사용된다.
제너레이터를 이해하기 위해서는 다음과 같은 함수를 먼저 소개한다.
시작할 때 print를 이용하여 메시지를 출력하고, 0부터 4까지 각 값의 제곱을 val이라는 리스트에 추가하여 반환해주는 함수이다.
def method():
print("Start method()")
val = []
for x in range(0, 5):
val.append( x**2 )
return val
그러나 Return 키워드를 사용한 코드에는 성능 문제가 있다.
만약에 range(0, 10000) 같이 범위가 매우 커지면, 메모리 공간도 부족하고 성능도 저하된다.
out = method()
for i in range(0, 5):
print(out[i])
out = method() 가 실행되는 순간 for문을 돌고 나온 후 리스트가 반환된다.
다음과 같이 출력값이 나온다.
# Start method()
# 0
# 1
# 4
# 9
# 16
제너레이터는 이와 같은 메모리 문제와 성능 저하 문제를 해결해줄 수 있다.
Yield 키워드를 사용하여 제너레이터를 이용할 수 있다.
def generator():
print("Start generator()")
for x in range(0, 5):
yield x**2
방금 전 살펴보았던 method()와는 다르게 다음과 같이 generator()를 실행해도 메시지가 출력되지는 않는다.
gen = generator()
계산 부분이 아직 실행되지 않은 채로 제너레이터가 선언만 되어 있는 상태이다.
다음과 같이 next()를 사용해야 실제 계산이 실행된다.
for i in range(0, 5):
print(next(gen))
next를 호출할 때마다 yield까지만 실행이 된다.
그러므로 메모리 공간도 아낄 수 있고 성능 저하도 막을 수 있다.
'프로그래밍 > Python' 카테고리의 다른 글
Python - Closure 함수 (0) | 2023.12.15 |
---|---|
Python - 클래스 속성과 메서드 사용 (2) | 2023.11.25 |
Python - 인스턴스 변수 vs 정적변수 (0) | 2023.11.25 |
Python - 클래스 생성자 (2) | 2023.11.25 |
Python - 클래스 (1) | 2023.11.25 |