Python 제너레이터

snooby·2022년 8월 4일
0

⚒ Python

목록 보기
3/14
post-thumbnail

Python의 제너레이터는 강력한 기능입니다.
그 이유를 알아봅시다.

1. lazy_evaluation

장점 : 모든 값을 메모리에 올리지 않습니다. 대신, 필요할 때마다 생성해서 반환하므로 메모리 효율적으로 사용

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이라고 한다.

2. yield

데이터를 원하는 시점에 반환하고 처리 다시 시작 가능

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라고 불리는데 이러한 특성을 잘 활용하면 좀 더 효율적인 프로그램 작성 가능

특히 메모리를 한번에 올리기 부담스러운 대용량 파일 읽거나, 스트림 데이터 처리할 때 유용.

3. 무한 데이터 생성

def yield_infinite_abc():
   while True:
   yield "A"
   yield "B"
   yield "C"
    
for ch in yield_infinite_abc():
   print(ch)

A, B, C가 화면에 끊임없이 출력
무한 작성은 yield 외에는 불가, 컴퓨터의 물리적인 메모리는 한계가 있기 때문에

profile
데이터를 가치있게 다루고 싶은 개발자 🐥

0개의 댓글