2015-01-08 5 views
1

발전기가 '상태를 저장'하고 모든 것을 한꺼번에 계산하지 않는 반복문을 반환한다는 일반적인 생각을 이해합니다. 각 호출을 next으로 계산합니다. 이게 어떻게 작동합니까? 예 : [x for x in range(10) if x%2==0](x for x in range(10) if x%2==0). 목록 이해에서 모든 것이 계산되어 즉시 메모리에 저장됩니다.파이썬 생성기가 메모리를 저장하는 방법

생성기에서는 전체 목록이 생성되지 않고 대신 next를 호출 할 때마다 계산되는 반복 가능한 생성기 개체가 생성됩니다. 하지만이 발전기는 어쨌든 "경계선"이라는 것을 알아야합니다. 맞습니까? 발전기가 모든 계산을 수행하는 백그라운드에 없다면 어떻게 알 수 있습니까? 나는 그것이 목록 이해력의 각 단계를 알아야하고 궁극적으로 StopIteration이 부딪 힐 때까지 전체 발전기를 순환하는 것으로 끝나면 대략 동일한 양의 메모리를 사용하고 있다고 생각할 것입니다.

+0

Heh, @thefourtheye, 나는 그 정보를 약간 다른 형태로 재연하려하고있었습니다. 그러나 다른 대답은 실제로이 질문에 대답하기에 충분한 정보를 담고 있습니다. –

+0

'range'는 (최소한 파이썬 2x에서)리스트를 반환합니다 ... 기본적으로 생성자로부터의 모든 이점을 완전히 지 웁니다 ... –

+2

@JoranBeasley : OP가 파이썬 3.x를 사용하고 있다고 자비로 가정합니다. :-) –

답변

1

그러나이 생성기는 어떻게 든 그것이 "경계"라는 것을 알아야합니다. 맞습니까?

아니요! StopIteration에 도달 할 때까지 계속 트럭에 머물러 있습니다. 한 번에 하나의 요소 만 메모리에서 처리 한 다음 삭제합니다.

+0

나는 위의 제안 된 사본을 검토 할 것이다. (나는 직접 검색을 시도했다.) 그러나 이것은 기본적으로 내가 이해하지 못하는 것이다. 한 번에 하나의 항목 만 처리하려면 iterable 객체의 순서가 어디인지를 알아야합니다. 그러면 이전 요소를 모두 버리면 어떻게 알 수 있습니까? 다른 말로하면, next가 이미 'x'번으로 여러 번 호출되었음을 어떻게 알 수 있습니까? 예를 들어 누적 집계 계산을 유지하지 않으면 '제 3'시간 계산을 수행해야합니다. StopIteration에 도달 할 때까지 메모리 이익) – Solaxun

+0

[이 기사를] 제공하십시오 (http://www.jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/).) 읽기. 생성기는 요소를 원할 때마다'StopIteration'을 치기 전까지'next'를 계속 호출합니다. 그들은 거기에 도착할 때까지 'StopIteration'이 어디에서 발생하는지 알지 못합니다. – CoryKramer

관련 문제