참조 : 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

+ Recent posts