PEP 380 mentions that the yield from expr
syntax can be optimized in Python.
Using a specialised syntax opens up possibilities for optimisation when there is a long chain of generators. Such chains can arise, for instance, when recursively traversing a tree structure. The overhead of passing
__next__()
calls and yielded values down and up the chain can cause what ought to be an O(n) operation to become, in the worst case, O(n**2).A possible strategy is to add a slot to generator objects to hold a generator being delegated to. When a
__next__()
orsend()
call is made on the generator, this slot is checked first, and if it is nonempty, the generator that it references is resumed instead. If it raisesStopIteration
, the slot is cleared and the main generator is resumed.This would reduce the delegation overhead to a chain of C function calls involving no Python code execution. A possible enhancement would be to traverse the whole chain of generators in a loop and directly resume the one at the end, although the handling of
StopIteration
is more complicated then.
Does CPython implement this optimization?