10

(これはPyPy の統計プロファイラーのフォローアップです)

PyPy でいくつかの Python コードを実行しており、最適化したいと考えています。

Python では、statproforlineprofilerを使用して、速度低下の原因となっている正確な行を特定し、それらを回避しようとします。ただし、PyPy では、PyPy がいくつかの行を最適化する可能性があるため、どちらのツールも実際には適切な結果を報告しません。cProfileまた、報告された関数のどの部分がボトルネックであるかを抽出するのが非常に難しいため、使用しないことをお勧めします。

続行する方法についてのヒントはありますか?おそらく、PyPy で適切に動作する別のプロファイラーでしょうか? 一般に、Python コードを PyPy 用に最適化するにはどうすればよいでしょうか?

4

1 に答える 1

6

PyPy アーキテクチャの仕組みを理解していれば、コードの個々の行を正確に特定しようとしても実際には生産的ではないことに気付くでしょう。RPython で記述された Python インタープリターから開始します。次に、フロー グラフを生成するトレース JIT を実行し、それらのグラフを変換して RPython インタープリターを最適化します。これが意味することは、JIT されている RPython インタープリターによって実行される Python コードのレイアウトは、最適化されたアセンブラーが実際に実行されるものとは非常に異なる構造を持つ可能性があるということです。さらに、JIT は常にループまたは関数で機能するため、行ごとの統計を取得しても意味がないことに注意してください。その結果、私は思うcProfile最適化をどこに集中すべきかのアイデアが得られるので、これは本当に良いオプションかもしれません。どの関数がボトルネックであるかがわかれば、Python コードの 1 行を修正しようとするのではなく、それらの遅い関数を対象に最適化の努力を費やすことができます。

これを行うときは、PyPy のパフォーマンス特性が cPython とは大きく異なることに注意してください。できるだけ単純な方法でコードを書くように常に心がけてください (これは、可能な限り少ない行を意味するわけではありません)。特殊なリストを使用する、ほぼ一定のキーが少数ある場合に dict でオブジェクトを使用する、C Python API を使用して C 拡張を回避するなど、役立つヒューリスティックが他にもいくつかあります。

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

于 2013-10-20T23:27:58.357 に答える