2017-04-24 11 views
3

PEP 380は、yield from exprの構文がPythonで最適化できると述べています。専門的な構文を使用して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に問い合わせることができます。著者のグレッグ・ユーイングは時々そこに投稿します。 –

答えて

2

このようには見えません。 Python 3.6以降では、generator object structureに提案フィールドはなく、yield fromのコードパスは、常に一連のPythonスタックフレームを個別に再開するプロセスを経ています。 (このコードパスはそこからチェーン内の次の発電機のYIELD_FROMからPyEval_EvalFrameExにし、上gen_send_ex_PyGen_Send/gen_iternextYIELD_FROMオペコードから行く、と。)

+0

その機能をリクエストする可能性はありますか?私の「親指」投票はどこに置くことができますか? – Paebbels

関連する問題