5

Psycoは Python に特化したコンパイラです。ドキュメントの状態

Psyco は大量のメモリを使用する可能性があり、使用する予定です。

このメモリ使用量の主な理由は何ですか? 一般に、かなりのメモリ オーバーヘッドは JIT コンパイラの機能ですか?

編集:これまでの回答に感謝します。有力候補は3人。

  • それぞれがメモリを必要とする複数の特殊なブロックの書き込み
  • オンザフライでソースをコンパイルすることによるオーバーヘッド
  • 動的プロファイリングを行うのに十分なデータをキャプチャすることによるオーバーヘッド

問題は、メモリ使用量の支配的な要因はどれかということです。私は自分の意見を持っています。しかし、実際に正しい答えを受け入れたいので、報奨金を追加しています! メモリの大部分がどこで使用されているかを誰かが実証または証明できる場合は、それを受け入れます。それ以外の場合、コミュニティが投票した人は、バウンティの最後に自動的に承認されます.

4

4 に答える 4

10

psyco の Web サイトから「JIT コンパイラへの従来のアプローチとの違いは、Psyco が同じブロック (ブロックは関数の一部) の複数のバージョンを記述し、いくつかの種類の変数 (「種類」タイプを意味することもありますが、より一般的です)"

于 2009-09-17T11:31:48.467 に答える
5

「Psyco は、プログラムが操作する実際の実行時データを使用して、さまざまな種類のデータにそれぞれ特化したマシン コードの複数のバージョンを作成する可能性があります。」http://psyco.sourceforge.net/introduction.html

多くの JIT コンパイラは静的に型付けされた言語で動作するため、型が何であるかを知っているため、既知の型だけのマシン コードを作成できます。より良いものは、型が多態的である場合に動的プロファイリングを行い、より一般的に遭遇するパスを最適化します。これは、動的型を特徴とする言語でも一般的に行われます†。Psyco は、完全なプログラム分析を行って型が何であるかを判断したり、プロファイリングして使用されている型を見つけたりすることを避けるために、その賭けをヘッジしているようです。

† Python に動的な型 (オブジェクトがその型で作成された後、実行時に構造を変更できる型) があるかどうか、または一般的な実装のみがあるかどうかを判断するのに十分なほど Python に深く入り込んだことはありません。実行時に型をチェックします。ほとんどの記事は、Python のコンテキストで動的型付けを実際に定義することなく、動的型付けを絶賛しているだけです。

于 2009-09-17T12:03:45.893 に答える
2

間違いなく、サイコのメモリ使用量は、コンパイルされたアセンブラ ブロックに由来します。Psyco は、関数の過度の特殊化に悩まされることがあります。つまり、複数のバージョンのアセンブラー ブロックが存在します。また、これも非常に重要ですが、関連付けられているコードが死んでいても、サイコは一度割り当てられたアセンブラー ブロックを決して解放しません。

Linux でプログラムを実行する場合、/proc/xxx/smaps を調べて、ヒープとは異なる領域にある匿名メモリのブロックが増加していることを確認できます。これは、アセンブラを書き留めるための匿名で mmap された部分であり、psyco なしで実行するともちろん消えます。

于 2009-10-23T06:17:47.590 に答える
2

Psyco のメモリ オーバーヘッドは現在大きいです。時間の経過とともに少し軽減されましたが、それでもオーバーヘッドです。このオーバーヘッドは、Psyco が書き換える Python コードの量に比例します。したがって、アプリケーションにアルゴリズムの「コア」関数がいくつかある場合、これらは、プログラム全体ではなく、Psyco に加速させたいものです。

したがって、大量のメモリ要件は、ソースをメモリにロードしてからコンパイルするという事実によるものだと思います。より多くのソースを試してコンパイルすればするほど、より多くのソースが必要になります。それに加えて最適化しようとしている場合は、複数の可能な解決策を調べて、最良のケースを特定しようとするでしょう。

于 2009-09-17T11:25:24.317 に答える