참조 : https://wikidocs.net/16069
iterator를 생성해 주는 함수이며 함수 안에 yield 키워드를 사용
iterable한 순서가 지정됨
순서의 다음값이 필요에 따라 계산됨
함수 내부의 로컬 변수를 통해 내부 상태가 유지
무한한 순서의 객체를 모델링 할 수 있음
문득 든 생각이... 피보나치수열 만들때 이걸 쓰면 되는거 아닐까? 라는 생각이 들었고 ... 생각보다 잘 되는데 싶다
def fibo(a,b):
fibolist=[a,b]
while True:
now = fibolist[-1] + fibolist[-2]
fibolist.append(now)
yield now
fibos = fibo(1,1)
fibolist=[1,1]
for i in range(10):
fibolist.append(next(fibos))
fibolist
# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
이렇게 yield방식을 생각했을때 제일먼저 떠오른게 피보나치였고, 이게 과연 피보나치의 근본접근법이라고 여겨지는 Dynamic programming에서 Memoization과 얼마나 속도 차이가 날까? 테스트해보았다
# Yield를 사용했을 때
%%time
def fibo(a,b):
fibolist=[a,b]
while True:
now = fibolist[-1] + fibolist[-2]
fibolist.append(now)
yield now
def getfibo(n):
fibos = fibo(1,1)
fibolist=[1,1]
for i in range(n-2):
fibolist.append(next(fibos))
return fibolist
tmp=getfibo(100*1000)
len(tmp)
# Memoization
%%time
def getfibo(n):
fibos=[1,1]
while len(fibos)<n :
fibos.append(fibos[-1]+fibos[-2])
return fibos
tmp = getfibo(100*1000)
len(tmp)
둘의 시간차이가 거의 없다...
'Python' 카테고리의 다른 글
Python Decorator에 대하여 @ 데코레이터 (0) | 2021.06.14 |
---|---|
lambda , filter, map (0) | 2021.05.11 |
Global에 대하여 (0) | 2021.05.11 |
Object-Oriented Programming (0) | 2021.05.11 |