2013-06-27 11 views
7

のために最適化私はPyPyの下にいくつかのPythonコードを実行していることだし、それを最適化したいと思いはPyPy

(これはStatistical profiler for PyPyのフォローアップです)。

Pythonでは、どの正確な行が減速の原因であるかを知り、それらを回避しようとすると、statprofまたはlineprofilerを使用します。しかしPyPyでは、PyPyがいくつかの行を最適化するので、どちらのツールも実際の結果を実際には報告しません。私はまた、報告された機能のどの部分がボトルネックであるのかを調べるのが非常に難しいので、cProfileを使用しないことをお勧めします。

今後の進め方に関するヒントはありますか? PyPyの下でうまく動作する別のプロファイラでしょうか?一般的にPyPyのPythonコードを最適化する方法は?

答えて

5

PyPyアーキテクチャの仕組みを理解していれば、個々のコード行を正確に特定しようとすると生産性が上がらないことに気付くでしょう。 RPythonで書かれたPythonインタプリタから始めて、フローグラフを生成し、そのグラフを変換してRPythonインタプリタを最適化するトレースJITを実行します。つまり、JITされているRPythonインタプリタによって実行されるPythonコードのレイアウトは、実際に実行される最適化されたアセンブラとは非常に異なる構造を持つことになります。さらに、JITは常にループまたは関数で動作するため、行単位の統計情報を取得することは意味がありません。結果的に、私はcProfileがあなたの最適化に集中するためのアイデアを提供するので、実際にあなたにとって良い選択肢になると思います。ボトルネックとなっている関数が分かったら、Pythonコードを1行修正するのではなく、より低速な関数を対象とした最適化作業を行うことができます。

PyPyはcPythonとは非常に異なるパフォーマンス特性を持っていることに注意してください。できるだけシンプルな方法でコードを書くようにしてください(可能な限り少ない数の行を意味するわけではありません)。特定のリストを使用する、CのPython APIを使用してCの拡張を避ける、CのPython APIを使用してCの拡張を避けるなどの特殊なリストを使用するなど、いくつかの他のヒューリスティックがあります。

本当に、ラインレベルで最適化しようとしています。いくつかのオプションがあります。 1つはJitViewer(https://bitbucket.org/pypy/jitviewer)と呼ばれ、JITがあなたのコードに対して行っていることを非常に低いレベルで見ることができます。たとえば、Pythonループに対応するアセンブラ命令を見ることもできます。このツールを使用すると、PyPyがコードの特定の部分でどのくらい速く動作するかを実際に知ることができます。ループなどで使用されるアセンブラ命令の数をカウントするなど、愚かなことを行うことができます。

+0

あなたの提案は何ですか? –

+1

PyPyの実際の動作を考えれば、私はcProfileを使うことを提案しました。 2番目の提案は、コードのパフォーマンス特性を低レベルで理解する必要がある場合は、JitViewerを使用することでした。 – jlund3

+1

フローグラフの変換は、インタプリタ自体を実装するRPythonコードをコンパイルして最適化するときに適用されます。Pythonコードではありません。これらの変換は、CコンパイラがCPythonインタプリタのCコードに適用する変換と同等であり、エンドユーザのPythonコードとは何の関係もありません。 PyPyのJITはあなたが話している問題の種類を提示します。ホットループは、アセンブリコードの複数の異なるブロックにJITコンパイルされる可能性が高いため、パフォーマンスを個別のPythonステートメントに厄介なものに戻すことができます。 – Ben

関連する問題