私はCythonを使用して関数をCにコンパイルしていますが、 "Unreachable code"警告を受け取ります。 pyx
ファイルを調べると、私はそれがどうやって得たか分かりませんが、さらにreturn locals()
が表示されます。cython.inlineを使用しているときに到達不能なコード
コードがcython.inline
によって生成されます。
cython.inline('return a * b + c if a > b else 0.0', a=1, b=2, c=3)
次のようになりますPYXファイル生成する:私はこの機能をcythonizingていた理由は、パフォーマンスを向上させることです
def __invoke(double a, double b, double c):
return a * b + c if a > b^2 else 0.0
return locals()
を。上記の機能は単純化されていますが、基本的な要素は同じです。インライン関数は配列numpy
を使用していないことに注意してください。誰かが表現を評価するより速い方法を考えることができれば、私はそれを試してみてうれしく思います(元の表現の構文は少し異なりますが、私はそれをどのような形式にでもコンパイルできます)。
とにかく、この質問の主なポイントは、理由と追加のreturn
ステートメントが追加され、それを削除する方法を理解することです。
更新
これは私がcython.inline
コール(@DavidWとの会話を指し)から気づいたオーバーヘッドです。
ありがとうございます。私はこれのためのソースコードをチェックすることを忘れました...はい、この関数は繰り返し呼び出されます。私はそれをcythonizingですばらしいスピードアップに気づいたが、Cythonのいくつかの呼び出しから、少しでもオーバーヘッドがあった。これは、一度コンパイルされても関数がキャッシュされていてもうまくいくだろう。私はそれがインライン展開かCythonが動作するかどうかによるのだろうかと思います。コールは異なる場所で発生し、実際のループから遠く離れているため(一部の配列データのカーネル機能とは異なります)、ループを組み込むことはできません。 – orange
関連するコールのrunnakerunスクリーンショットで質問を更新しました。 – orange
@orange私は、キャッシュされているかどうかを調べるために大抵のことをしていると思います(回答にgithubリンクのコードを見てください - それはかなり複雑です)。 pyxファイルで1行の関数を作成し、それを普通にコンパイルした方がパフォーマンスが向上します。関数が呼び出されると、オーバーヘッドチェックの型はまだありますが、それは少なくなります。 – DavidW