CPython是否实现了PEP 380中提到的优化?

时间:2017-04-24 15:01:16

标签: python python-3.x cpython python-internals yield-from

PEP 380提到可以在Python中优化yield from expr语法。

  

PEP 380 - Optimizations

     

当存在长链生成器时,使用专门语法为优化提供了可能性。例如,当递归地遍历树结构时,可能出现这样的链。传递__next__()次调用并在链中向上和向上产生值的开销可能导致应该是O(n)操作,在最坏的情况下,O(n ** 2)。

     

可能的策略是向生成器对象添加一个槽以保存委派给它的生成器。当在生成器上进行__next__()send()调用时,首先检查此插槽,如果它是非空的,则引用它引用的生成器。如果它引发StopIteration,则清空插槽并恢复主发生器。

     

这将减少一系列C函数调用的委托开销,这些调用不涉及Python代码执行。可能的增强是遍历循环中的整个生成器链并直接恢复最后的生成器,尽管StopIteration的处理比较复杂。

CPython是否实现了此优化?

1 个答案:

答案 0 :(得分:2)

看起来不像。从Python 3.6开始,generator object structure没有建议的字段,yield from通过一系列生成器的代码路径总是经历单独恢复其Python堆栈帧的过程。 (此代码路径从YIELD_FROM操作码到_PyGen_Send / gen_iternextgen_send_ex,从那里到PyEval_EvalFrameEx再到YIELD_FROM链中的下一个发电机。)