Python의 제너레이터는 강력한 기능입니다.
그 이유를 알아봅시다.
장점 : 모든 값을 메모리에 올리지 않습니다. 대신, 필요할 때마다 생성해서 반환하므로 메모리 효율적으로 사용
python
my_generator = (x for x in range(1,4))
for n in my_generator:
print(n)
여기서 생성된 1,2,3을 미리 메모리에 만들어 두는 것이 아니라, for문에서 필요할 때마다 my_generator로 부터 받아오며 이를 lazy_evaluation이라고 한다.
데이터를 원하는 시점에 반환하고 처리 다시 시작 가능
import time
def return_abc():
alphabets = []
for ch in "ABC":
time.sleep(1)
alphabets.append(ch)
return alphabets
for ch in return_abc():
print(ch)
import time
def yield_abc():
for ch in "ABC":
time.sleep(1)
yield ch
for ch in yield_abc():
print(ch)
출력해야할 개수가 많아진다면 그만큼 return시 오래걸리나 yield는 늘 1초면 끝. 즉, 제너레이터를 통해서는 결과값을 나누어서 얻을 수 있기 때문에 성능 측면에서 큰 이점이 있다.
메모리 효율 측면에서도 return은 모든 결과 값을 메모리에 올려놓아야하는 반면, yield는 결과값을 하나씩 메모리에 올려놓아 효과적.
이런 특성 때문에 lazy iterator라고 불리는데 이러한 특성을 잘 활용하면 좀 더 효율적인 프로그램 작성 가능
특히 메모리를 한번에 올리기 부담스러운 대용량 파일 읽거나, 스트림 데이터 처리할 때 유용.
def yield_infinite_abc():
while True:
yield "A"
yield "B"
yield "C"
for ch in yield_infinite_abc():
print(ch)
A, B, C가 화면에 끊임없이 출력
무한 작성은 yield 외에는 불가, 컴퓨터의 물리적인 메모리는 한계가 있기 때문에