2017-04-24 20 views
3

PEP 380提到可以在Python中優化yield from expr語法。CPython是否從PEP 380實現了上述優化?

PEP 380 - Optimizations

使用專門的語法開闢了可能性爲優化時,還有很長的發電機鏈。例如,當遞歸遍歷樹結構時,會出現這樣的鏈。通過__next__()調用併產生值的開銷會導致在最壞的情況下O(n ** 2)應該成爲O(n)操作。

一種可能的策略是向生成器對象添加一個插槽以容納委託給的生成器。當對發生器進行__next__()send()調用時,首先檢查該槽,如果它不是空的,則它所引用的發生器將被恢復。如果它升高StopIteration,插槽被清除並且主發生器恢復。

這樣可以降低代理開銷,使其不涉及Python代碼執行的C函數調用鏈。一個可能的增強將是循環遍歷整個發電機鏈,並直接恢復最後一個,儘管StopIteration的處理比較複雜。

CPython是否實現了這種優化?

+0

您應該指定的位置,然後引用具體線路或你所指的行。由於PEP是由CPython開發人員編寫和批准的,並且首先爲CPython實施,所以無論您指的是什麼,我都會猜測'是',但我不確定。你可以寫時間測試,或者查詢python-list來獲得更好的答案。作者Greg Ewing偶爾在那裏發帖。 –

回答

2

看起來不像。從Python 3.6開始,generator object structure沒有提出的字段,並且通過一系列生成器的代碼路徑yield from總是經歷逐個恢復它們的Python堆棧幀的過程。 (此代碼路徑從YIELD_FROM操作碼通過_PyGen_Send/gen_iternextgen_send_ex去,並從那裏到PyEval_EvalFrameEx並以鏈的下一臺發電機的YIELD_FROM)。

+0

是否有可能要求該功能?我可以在哪裏放置我的「大拇指」投票? – Paebbels