2

私はプロジェクトオイラーに取り組んでいて、PyPyを使用してソリューションを高速化できるかどうか疑問に思いました。ただし、計算に時間がかかったため、結果は非常に残念でした。

d:\projeuler>pypy problem204.py
3462.08630405 mseconds

d:\projeuler>python problem204.py
1823.91602542 mseconds

ミリ秒の出力はPythonのtimeモジュールを使用して計算されたため、組み込みのベンチマークコマンドを使用して再度実行しました。

d:\projeuler>pypy -mtimeit -s "import problem204" "problem204._main()"
10 loops, best of 3: 465 msec per loop

d:\projeuler>python -mtimeit -s "import problem204" "problem204._main()"
10 loops, best of 3: 1.87 sec per loop

PyPyは、実行を完了するのに約0.5秒かかったと報告しています。ただし、pypy problem204を数回実行してみたところ、出力がベンチマークの0.5秒に近づくことはありませんでした。pypyとは異なり、pythonのmtimeitの結果は出力と一致しています。pypyは私に不正確なベンチマークを与えていますか、それとも私が理解していない魔法がありますか?

4

1 に答える 1

5

時間に注意してください

  1. ステートメントを数回 (この場合は 10 回) 実行し、
  2. はそれを数回 (デフォルトでは 3 回) 実行し、ドキュメンテーションで概説されている理由により、その最小値を示します。

コードにもよりますが、この紛らわしい結果の原因が JIT コンパイラにある可能性は十分にあります。JIT ウォームアップ オーバーヘッドは、新しい pypy プロセスを起動するたびに発生しますが、ベンチマーク中に 1 回だけ発生します (_main同じプロセスで複数回実行されるため)。さらに、コードの一部が頻繁に実行され、_main1 回実行したときはコンパイルされず、たとえば 3 回実行したときのみコンパイルされる場合、その後の実行も高速になり、最初の実行から最良の結果がさらに削除されます (つまり、一度実行するためのものpypy problem204.py)。

結果は、コードが最良の場合 (ウォームアップされた JIT コンパイラー、他のプログラムに CPU を失うことはめったにないなど) での速度と (大まかに) 一致するという点で正しいです。timeit問題は、何か違うことを知りたいということです。 JITウォームアップを含む時間。

于 2012-11-01T16:04:46.963 に答える