pystoneによるPythonとIronPythonの速度比較
一ヶ月も前にひいた風邪のせいで、今でも咳きが続いている今日この頃。
やっぱり、体調管理は重要ですね。
それはそれとて、以前のネタで、Fomalhautさんより「Overview」を訳して頂いた内容を(Fomalhautさん ありがとうございます) つらつらと読みながら、「IronPython は Python の標準実装と比較すると 1.8 倍高速に動作する」の項を、そういや自分で検証した事が無かったなぁと思い出しました。
という訳で、早速テスト。
コードは、以下のコードを作って試してみました。
#!/usr/bin/env python # coding: cp932 import sys if sys.version.find("IronPython") != 0: sys.path.append(r"C:\tool2\Python24\Lib") import timeit print sys.version t = timeit.Timer("test.pystone.main()", "import test.pystone") t.timeit(10)
純粋な計測だけしたかったので、Timerコンストラクタの、setup引数に import文を持っていってみました。
多分、こうすれば、test.pystoneモジュールは 1回ロードされた後、使い続けられると思うんですが、どうなんでしょう?
後、timeitモジュールですが、IronPythonで動かすには、timeit.pyの159〜163行の、gcのメソッド呼び出し部分をコメントアウトしないと動きませんでした。
エラーメッセージを読んでいると、どうもガーベッジコレクションの抑制機能は、実装されてないみたいです。
実行結果は、長いので後に回します。
実行結果を表にまとめ直した結果を、下表に示します。(1秒間に何回実行できるか?という意味なので、値が大きいほど良いです)
項目 | Python 2.4.2 | Python 2.5.0 | IronPython 1.1 | Python 2.0α |
---|---|---|---|---|
1回目 | 36511.6 | 31877.2 | 39581 | 40131.4 |
2回目 | 36284.7 | 30400.5 | 45098.8 | 46246.3 |
3回目 | 36354.9 | 33628.5 | 46099.8 | 48305.2 |
4回目 | 36072.3 | 33380.6 | 44337.5 | 48648.6 |
5回目 | 35578.3 | 33433.3 | 45499.3 | 47269.7 |
6回目 | 35669.7 | 33144.1 | 45674.9 | 47465.4 |
7回目 | 35600 | 33594.6 | 46229.2 | 48227.5 |
8回目 | 36639.5 | 33227.5 | 46112 | 49659.2 |
9回目 | 34549.9 | 32128.5 | 45204.7 | 47943.7 |
10回目 | 34596.2 | 33833.1 | 45732.8 | 47684.8 |
平均(1-10) | 35785.71 | 32864.79 | 44957 | 47158.18 |
平均(2-10) | 35705.05556 | 32974.52222 | 45554.33333 | 47938.93333 |
で、「平均(2-10)」をExcelで棒グラフにしました。(何故、1-10でなく2-10かと言うと、最初の1回目は、モジュールのロード処理+最初のコンパイル処理が入るので計測対象に不適と考えたから)
pystone1 posted by (C)wacky
ちなみに実測環境は、以下の通り。
まとめ
恒例のまとめです。
- pystoneの比較だけですが、IronPythonはPythonより、確かに速いです。
- α段階なのに、1.1より2.0の方が、更に速いです。
- DLR(Dynamic Language Runtime)の対象である、IronRubyとか、どの程度速くなるか楽しみですね。
実行結果
上に示したソースを呼び出した結果を、以下に転記します。
H:\user>python test2.py 2.4.2 (#67, Sep 28 2005, 12:41:11) [MSC v.1310 32 bit (Intel)] Pystone(1.1) time for 50000 passes = 1.36943 This machine benchmarks at 36511.6 pystones/second Pystone(1.1) time for 50000 passes = 1.37799 This machine benchmarks at 36284.7 pystones/second Pystone(1.1) time for 50000 passes = 1.37533 This machine benchmarks at 36354.9 pystones/second Pystone(1.1) time for 50000 passes = 1.38611 This machine benchmarks at 36072.3 pystones/second Pystone(1.1) time for 50000 passes = 1.40535 This machine benchmarks at 35578.3 pystones/second Pystone(1.1) time for 50000 passes = 1.40175 This machine benchmarks at 35669.7 pystones/second Pystone(1.1) time for 50000 passes = 1.40449 This machine benchmarks at 35600 pystones/second Pystone(1.1) time for 50000 passes = 1.36465 This machine benchmarks at 36639.5 pystones/second Pystone(1.1) time for 50000 passes = 1.44718 This machine benchmarks at 34549.9 pystones/second Pystone(1.1) time for 50000 passes = 1.44525 This machine benchmarks at 34596.2 pystones/second H:\user>python test2.py 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] Pystone(1.1) time for 50000 passes = 1.56852 This machine benchmarks at 31877.2 pystones/second Pystone(1.1) time for 50000 passes = 1.64471 This machine benchmarks at 30400.5 pystones/second Pystone(1.1) time for 50000 passes = 1.48683 This machine benchmarks at 33628.5 pystones/second Pystone(1.1) time for 50000 passes = 1.49787 This machine benchmarks at 33380.6 pystones/second Pystone(1.1) time for 50000 passes = 1.49551 This machine benchmarks at 33433.3 pystones/second Pystone(1.1) time for 50000 passes = 1.50856 This machine benchmarks at 33144.1 pystones/second Pystone(1.1) time for 50000 passes = 1.48833 This machine benchmarks at 33594.6 pystones/second Pystone(1.1) time for 50000 passes = 1.50478 This machine benchmarks at 33227.5 pystones/second Pystone(1.1) time for 50000 passes = 1.55625 This machine benchmarks at 32128.5 pystones/second Pystone(1.1) time for 50000 passes = 1.47784 This machine benchmarks at 33833.1 pystones/second H:\user>ipy test2.py 2.4.0 (IronPython 1.1 (1.1) on .NET 2.0.50727.42) Pystone(1.1) time for 50000 passes = 1.26323 This machine benchmarks at 39581.0 pystones/second Pystone(1.1) time for 50000 passes = 1.10868 This machine benchmarks at 45098.8 pystones/second Pystone(1.1) time for 50000 passes = 1.08460 This machine benchmarks at 46099.8 pystones/second Pystone(1.1) time for 50000 passes = 1.12771 This machine benchmarks at 44337.5 pystones/second Pystone(1.1) time for 50000 passes = 1.09892 This machine benchmarks at 45499.3 pystones/second Pystone(1.1) time for 50000 passes = 1.09469 This machine benchmarks at 45674.9 pystones/second Pystone(1.1) time for 50000 passes = 1.08157 This machine benchmarks at 46229.2 pystones/second Pystone(1.1) time for 50000 passes = 1.08432 This machine benchmarks at 46112.0 pystones/second Pystone(1.1) time for 50000 passes = 1.10608 This machine benchmarks at 45204.7 pystones/second Pystone(1.1) time for 50000 passes = 1.09331 This machine benchmarks at 45732.8 pystones/second H:\user>ipy test2.py 2.4.0 (IronPython 2.0A1 (2.0.10427.02) on .NET 2.0.50727.42) Pystone(1.1) time for 50000 passes = 1.24591 This machine benchmarks at 40131.4 pystones/second Pystone(1.1) time for 50000 passes = 1.08117 This machine benchmarks at 46246.3 pystones/second Pystone(1.1) time for 50000 passes = 1.03509 This machine benchmarks at 48305.2 pystones/second Pystone(1.1) time for 50000 passes = 1.02778 This machine benchmarks at 48648.6 pystones/second Pystone(1.1) time for 50000 passes = 1.05776 This machine benchmarks at 47269.7 pystones/second Pystone(1.1) time for 50000 passes = 1.05340 This machine benchmarks at 47465.4 pystones/second Pystone(1.1) time for 50000 passes = 1.03675 This machine benchmarks at 48227.5 pystones/second Pystone(1.1) time for 50000 passes = 1.00686 This machine benchmarks at 49659.2 pystones/second Pystone(1.1) time for 50000 passes = 1.04289 This machine benchmarks at 47943.7 pystones/second Pystone(1.1) time for 50000 passes = 1.04855 This machine benchmarks at 47684.8 pystones/second
2008/03/02 : 追記
id:showyouさんとPythonメモさんが、色んなCPUで比較動作されてましたので、ちこっとグラフ化。
- 2007-08-15 - Showyou@hatena
http://d.hatena.ne.jp/showyou/20070815#1187190426 - 実行速度 - Showyou@hatena
http://d.hatena.ne.jp/showyou/20080226/1203977415 - Pythonメモ : 遅すぎるだろ!
http://blog.livedoor.jp/python_memo/archives/50466195.html
マシン | Pythonバージョン | pystone値 | 調べた人 |
---|---|---|---|
Core2Duo E6600(2.4GHz?) | Python 2.5.1 | 65500 | id:showyouさん |
Athlon64 X2 4600+(2.4GHz?) | Python 2.5 | 58000 | id:showyouさん |
PentiumM 900MHz(Let's note T2) | Python 2.5.1 | 23000-24000 | id:showyouさん |
Athron XP 1800+(1.53GHz?) | Python 2.5.1 | 24000 | Pythonメモさん |
Pentium4 2.6GHz | Python 2.5.0 | 32974 | id:Wacky |
やっぱ、最新CPUは速いですねぇ。