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