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"]
'유용 노트' 카테고리의 다른 글
[python] 정규식 정리 (re) - 스크랩 (0) | 2022.05.06 |
---|---|
[python] 헷갈리는 list comprehension, 자주 실수하는 dict (0) | 2022.05.05 |
model.eval() 과 with torch.no_grad() 차이 (0) | 2022.04.05 |
Imbalanced data 다루기 (0) | 2022.03.17 |