PEP 380은 파이썬에서 yield from expr
구문을 최적화 할 수 있다고 언급합니다. 발전기의 장쇄가있을 때 특수 구문을 사용CPython은 PEP 380에서 언급 한 최적화를 구현합니까?
최적화 가능성을 연다. 예를 들어, 이러한 체인은 재귀 적으로 트리 구조를 통과 할 때 발생할 수 있습니다.
__next__()
호출을 전달하고 체인을 위로 올린 오버 헤드로 인해 최악의 경우 O (n ** 2)가되는 O (n) 연산이 생길 수 있습니다.가능한 전략은 위임 된 생성기를 보유하기 위해 생성기 개체에 슬롯을 추가하는 것입니다.
__next__()
또는send()
호출자가 생성기에서 호출되면이 슬롯이 먼저 검사되고 비어 있지 않으면 참조되는 생성기가 대신 다시 시작됩니다.StopIteration
이 발생하면 슬롯이 지워지고 주 발전기가 재개됩니다.이렇게하면 파이썬 코드를 실행하지 않는 C 함수 호출 체인의 위임 오버 헤드가 줄어 듭니다. 가능한 향상은 루프 내에서 전체 발전기 체인을 가로 질러 끝에서 직접 재개하는 것이지만,
StopIteration
의 처리는 더 복잡합니다.
CPython은 이러한 최적화를 구현합니까?
당신의 위치를 지정하고 특정 라인을 인용한다 또는 당신이 말하는 라인. PEP는 CPython 개발자들에 의해 작성되고 승인되었고 CPython을 위해 처음으로 구현 되었기 때문에, 나는 당신이 무엇을 언급하든 '예'라고 추측 할 것입니다. 그러나 나는 확실히 알지 못할 것입니다. 더 나은 답변을 얻으려면 타이밍 테스트를 작성하거나 python-list에 문의하십시오. 저자 인 그렉 유잉 (Greg Ewing)은 때때로 거기에 글을 올립니다. –