PEP 380は、yield from expr
の構文がPythonで最適化できると述べています。専門的な構文を使用してCPythonは前述のPEP 380の最適化を実装していますか?
発電機の長鎖がある場合には、最適化のための可能性を開きます。このような連鎖は、例えば、木構造を再帰的に横断するときに発生し得る。
__next__()
コールを渡してチェーンの上と下に値を渡すオーバーヘッドは、最悪の場合O(n ** 2)になるO(n)操作であるべきものを引き起こす可能性があります。可能な戦略は、ジェネレータオブジェクトを委譲するためにスロットをジェネレータオブジェクトに追加することです。
__next__()
またはsend()
がジェネレータでコールされると、最初にこのスロットがチェックされ、空でない場合は、参照されるジェネレータが代わりにレジュームされます。StopIteration
が発生すると、スロットはクリアされ、メインジェネレータが再開されます。これは、Pythonコードの実行を伴わないC関数呼び出しの連鎖に対する委任オーバーヘッドを削減します。可能な改善は、ループ内でジェネレータのチェーン全体を横断し、最後に直接再発生させることです。ただし、
StopIteration
の処理は複雑です。
CPythonはこの最適化を実装していますか?
あなたがの場所を指定して、特定の行を引用すべきですまたはあなたが参照している行。 PEPはCPython開発者によって作成され、承認され、最初にCPythonに実装されたので、あなたが何を指していても「はい」と思うでしょうが、私は確かに分かりません。より良い答えを得るために、タイミングテストを書くか、python-listに問い合わせることができます。著者のグレッグ・ユーイングは時々そこに投稿します。 –