9

pypy の実装を c ファイルに変換し、2G メモリと Intel Core2 2GHz CPU を搭載した最新のノートブックで pypy-c をビルドするには、数時間かかります。

CPUを集中的に使用するタスクであることは知っていますが、それほど遅くする必要がありますか? 計算を減らし、計算順序を再編成し、時間を数十分に短縮する機会や余地はありますか?

4

1 に答える 1

11

免責事項: 私は PyPy の専門家ではありません。特に、RPython の翻訳の詳細を理解していません。ドキュメントと、メーリング リストやブログで耳にしたことを引用しているだけです。

「CPU を集中的に使用するタスク」? 今月のアンダーステートメントにノミネートされました。私自身、翻訳プロセスの詳細をよく理解していませんが、いくつかの分析および最適化パスのそれぞれが、非常に複雑な作業を非常に多くのコードに対して行っていることは言えます。

  1. モジュールのインポート、モジュールレベルの変数定義の実行、関数とクラスの定義、それらへのデコレーターの適用など、Python コードの通常の実行を開始します。実際の翻訳プロセス。
  2. 凍結されたメモリ内の進行中の Python プログラムを取得し、フロー制御、変数の可能な値などをシミュレートする特別なオブジェクト空間でそのすべてを実行します。本質的には、インタプリタをシンボリックに実行しています! これは、型推論 (Python のような言語では簡単ですが) と追加の分析を実行するために行われます。
  3. 結果は低レベルのコードに変換されます。
  4. オプションで、多くの最適化 (デフォルトで有効になっていると思います) と、スタックレス サポートのための複雑な変換 (デフォルトで無効になっていると思います) が続きます。
  5. 次に、それらすべてを、指定されたバックエンドに適合する型システムに落とし込み、数百万行のコードを生成します (最近のメーリング リストのエントリによると、少なくとも 19 の .c ファイルがあり、そのうちの少なくとも 1 つには少なくとも 247,560 のファイルが含まれているようです。行 - 私たちが話している大きさのオーダーを理解できるようにするためです)。
  6. そのコードはすべて、または同様のものでコンパイルされますgcc -O2。もちろん、これには多くの解析とチェックが必要であり、それ自体にも多くの分析と最適化のパスが必要です。

ええ、それはかなりおかしな巨大な仕事です。あなたのちっぽけな CPU が失われたのも不思議ではありません。参考までに、PyPy 関係者は、2010 年 11 月に翻訳プロセスのベンチマークを行ったときに Intel Xeon W3580 (3.33 GHz) を使用しました。12 GB の RAM も持っていたにもかかわらず、約 76 分かかりました。これは次の問題につながります。プロセスには大量の RAM が必要です (当時の 64 ビット Ubuntu では 2.3 GB で、どのように数字は状況に応じて変換されます)。最終的に物理 RAM を超えてしまうことは間違いありません。過剰なスワッピングと関連するキックをパフォーマンスの股間に入力してください。

それは、CPU 時間と RAM を盗む他のいくつかのプログラムをおそらく実行していたという事実と相まって、私の意見では、あなたの経験をかなりよく説明しています。PyPy の翻訳は、より強力なコンピューター用に予約されています。この時代を根本的に改善できる何かがあるとしても、私たちのような部外者がそれを見つけることはまずありません. これらの心配は開発者に任せます。

于 2011-05-27T14:49:30.470 に答える