2013-08-28 3 views
1

나는 itertools.cycle(iterable)의 경고에 대한 궁금 :파이썬에서 itertools.cycle은 왜 추가 메모리가 필요합니까?

이 반복자는 반복 가능한 에서 요소를 반환 각각의 사본을 저장합니다. 반복 가능이 모두 소모되면 은 저장된 사본에서 요소를 리턴합니다. 무기한 반복합니다.

등가로 :

def cycle(iterable): 
    # cycle('ABCD') --> A B C D A B C D A B C D ... 
    saved = [] 
    for element in iterable: 
     yield element 
     saved.append(element) 
    while saved: 
     for element in saved: 
       yield element 
엔트리는 경고를 포함

"참고 툴킷이 부재합니다 (반복 가능 길이에 따라) 상당한 보조 기억 장치를 필요로 할 수있다."

당신과 함께 추가 스토리지 요구 사항 (일부 복잡성을) 피할 수 없습니다 :

def cycle(iterable): 
    while True: 
     for i in iterable: 
      yield i 

을 무엇 saved에 사용되는 항목을 저장의 장점?

답변

1

일부 iterables는 한 번만 반복 할 수 있습니다. 따라서주기는 복사본을 저장하므로 해당 항목을 계속 읽을 수 있습니다. this related question을 참조하십시오.

+0

그건 그냥 관련이있는 것이 아니라 완전히 똑같은 것입니다. – delnan

+0

예 ... 꽤 많이 ... – korylprince

+0

와우, itertools주기에 대한 15 개의 질문을 읽고, 전혀 보지 못했습니다. 중복해서 죄송합니다! – Brownbat

0

iterable은 요소를 생성하기 위해 값 비싼 계산을하는 일부 생성자 일 수 있습니다.

반복 가능한 결과를 캐싱하면 반복 가능한 반복을 반복하기 위해 잠재적으로 값 비싸고 시간이 많이 소요되는 작업을 반복하지 않아도됩니다.