2017-04-24 14 views
3

PEP 380은 파이썬에서 yield from expr 구문을 최적화 할 수 있다고 언급합니다. 발전기의 장쇄가있을 때 특수 구문을 사용CPython은 PEP 380에서 언급 한 최적화를 구현합니까?

PEP 380 - Optimizations

최적화 가능성을 연다. 예를 들어, 이러한 체인은 재귀 적으로 트리 구조를 통과 할 때 발생할 수 있습니다. __next__() 호출을 전달하고 체인을 위로 올린 오버 헤드로 인해 최악의 경우 O (n ** 2)가되는 O (n) 연산이 생길 수 있습니다.

가능한 전략은 위임 된 생성기를 보유하기 위해 생성기 개체에 슬롯을 추가하는 것입니다. __next__() 또는 send() 호출자가 생성기에서 호출되면이 슬롯이 먼저 검사되고 비어 있지 않으면 참조되는 생성기가 대신 다시 시작됩니다. StopIteration이 발생하면 슬롯이 지워지고 주 발전기가 재개됩니다.

이렇게하면 파이썬 코드를 실행하지 않는 C 함수 호출 체인의 위임 오버 헤드가 줄어 듭니다. 가능한 향상은 루프 내에서 전체 발전기 체인을 가로 질러 끝에서 직접 재개하는 것이지만, StopIteration의 처리는 더 복잡합니다.

CPython은 이러한 최적화를 구현합니까?

+0

당신의 위치를 ​​지정하고 특정 라인을 인용한다 또는 당신이 말하는 라인. PEP는 CPython 개발자들에 의해 작성되고 승인되었고 CPython을 위해 처음으로 구현 되었기 때문에, 나는 당신이 무엇을 언급하든 '예'라고 추측 할 것입니다. 그러나 나는 확실히 알지 못할 것입니다. 더 나은 답변을 얻으려면 타이밍 테스트를 작성하거나 python-list에 문의하십시오. 저자 인 그렉 유잉 (Greg Ewing)은 때때로 거기에 글을 올립니다. –

답변

2

보이지 않습니다. 파이썬 3.6부터는 generator object structure에 제안 된 필드가없고 생성자 체인을 통해 yield from의 코드 경로는 항상 파이썬 스택 프레임을 개별적으로 다시 시작하는 과정을 거칩니다. (이 코드 경로는 거기에서 체인의 다음 발전기의 YIELD_FROM-PyEval_EvalFrameEx과에 gen_send_ex_PyGen_Send/gen_iternext를 통해 YIELD_FROM 오피 코드에서 이동합니다.)

+0

해당 기능을 요청할 가능성이 있습니까? 내 "추천"투표는 어디에 둘 수 있습니까? – Paebbels