본문 바로가기

유용 노트

[python] yield


yield 명령어

  • 제너레이터를 만드는데 사용
  • 제너레이터는 여러 개의 데이터를 미리 만들어 놓지 않고 필요할 때마다 즉석에서 하나씩 만들어낼 수 있는 객체

코드로 살펴보기

def return_abc():
    return list("ABC")

def yield_abc():
    yield "A"
    yield "B"
    yield "C"

for s in return_abc():
    print(s, end=' ') # A B C 출력

for s in yield_abc():
    print(s, end=' ') # A B C 출력

# 같아 보이지만 yield_abc()는 제너레이터 반환
print(return_abc())
# ['A', 'B', 'C']
print(yield_abc())
# <generator object yield_abc at 0x0000026CEF735B30>

제너레이터 코드로 이해하기

import time

def return_abc():
    sentence = []
    for s in "ABC":
        time.sleep(1)
        sentence.append(s)
        return sentence

def yield_abc():
    for s in "ABC":
    time.sleep(1)
    yield s

for s in return_abc():
    print(s) # 3초 후에 ABC 출력

for s in return_abc():
    print(s) # 1초마다 A, B, C 출력

정리

  • 메모리 효율 측면에서 "return" 사용할 때는 모든 결과 값을 메모리에 올려서 반환
  • "yield" 는 결과 값을 하나 씩 메모리에서 올려서 반환 -> 대용량이나 스트림 데이터 처리할 때 유용
  • 무한 데이터를 생산 가능 (메모리 관점)
  • ex) 만개에 데이터를 1초 마다 보여줘야 할 때 return은 첫 결과를 보여주는데 10000초가 걸리는 반면 yield 는 1초

yield from (리스트를 제너레이터로)

def yield_abc():
    for s in ["A", "B", "C"]:
        yield s

def yield_abc():
    yield from ["A", "B", "C"]