Generator & Yield

참고 : 널널한 교수의 코딩 클래스


(1) Generator

  • 모든 값을 “메모리에 올려두지 않아”서, 메모리를 “효율적”으로 사용한다
  • 필요할 때마다 생성해서 반환!

  • yield 와 함께 사용


(2) yield

  • 일반적인 함수의 “return”과 유사
  • 차이점?
    • return : 값 반환
    • yield : generator 반환


Example

my_generator.py

def custom_generator():
    li_ = range(10,15)
    for x in li_:
        yield x

my_generator = custom_generator()
print(my_generator)

for n in my_generator:
    print(n)
PS C:\Users\LSH\Desktop\advanced_python> python my_generator.py
<generator object custom_generator at 0x0000021CAE906A50>
10
11
12
13
14


(3) Generator 사용 시 유의사항

Generator는, 생성해서 반환한 객체를 더 이상 보관 X

다 돌리고 나면, 다시 코드 돌려도 아무 것도 반환 X


Why Generator?

  • 수행 시간 절약
  • 메모리 절약


ex) 피보나치 수열 (100만개)

case 1 : generator 사용 X

fibonacci1.py

def fibon(n):
    a=b=1
    result=[]
    for _ in range(n):
        result.append(a)
        a,b = b, a+b
    return result

start_time=time.time()
for x in fibon(100000):
    pass
end_time=time.time()
print(end_time-start_time)


case 2 : generator 사용 O

fibonacci2.py

def fibon(n):
    a=b=1
    for _ in range(n):
        yield a
        a,b = b, a+b

start_time=time.time()
for x in fibon(100000):
    pass

end_time=time.time()
print(end_time-start_time)	


비교

PS C:\Users\LSH\Desktop\advanced_python> python fibonacci1.py
0.4420015811920166
PS C:\Users\LSH\Desktop\advanced_python> python fibonacci2.py
0.1792736053466797