티스토리 뷰
제너레이터(Generator)는 필요할 때마다 값을 하나씩 생성하고 반환하는 함수이다.
외부로 값을 보내기 위해 yield 키워드를 사용한다.
제너레이터에서 yield를 만나면 값을 리턴하고 일시중지한 상태로 기다린다. 그러다 다시 호출되면 중단된 지점부터 다시 실행된다.
def fibonacci():
a, b = 1, 1
while True:
yield a
a, b = b, a + b
fib_gen = fibonacci()
print(next(fib_gen)) # 1
print(next(fib_gen)) # 1
print(next(fib_gen)) # 2
print(next(fib_gen)) # 3
print(next(fib_gen)) # 5
print(next(fib_gen)) # 8
print(next(fib_gen)) # 13
Why Generator?
일반적으로 함수는 return 키워드를 통해 결과를 반환한다.
만약 함수의 리턴값이 여러개일때, 특히 아주 많을 때, 그 데이터를 생성하고 리턴하는 과정에서 많은 메모리가 사용되게 된다.
def get_big_number_array():
arr = []
for n in range(100_000_000):
arr.append(n)
# 이 과정에서 1~100,000,000 까지의 숫자를 저장하는 메모리가 사용됨.
return arr
result = []
for i in get_big_number_array():
result.append(i * 2)
반면 제너레이터를 사용하면 이 과정에서 메모리에 전체 배열을 담지 않고 같은 작업을 할 수 있다.
def big_number_generator():
for i in range(100_000_000):
# 데이터를 그때그때 생성하여 1억개의 데이터를 메모리에 저장할 필요가 없다.
yield i
result = []
for i in big_number_generator():
result.append(i * 2)
최근에 올라온 글
- Total
- Today
- Yesterday