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 がどれだけ高速に動作するかを実際に把握できます。これにより、ループなどで使用されるアセンブラー命令の数をカウントするなどのばかげたことを実行できるようになります。