ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

pystoneによるPythonとIronPythonの速度比較

一ヶ月も前にひいた風邪のせいで、今でも咳きが続いている今日この頃。
やっぱり、体調管理は重要ですね。


それはそれとて、以前のネタで、Fomalhautさんより「Overview」を訳して頂いた内容を(Fomalhautさん ありがとうございます) つらつらと読みながら、「IronPythonPython の標準実装と比較すると 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
pystone1 posted by (C)wacky


ちなみに実測環境は、以下の通り。

まとめ

恒例のまとめです。

  • pystoneの比較だけですが、IronPythonPythonより、確かに速いです。
  • α段階なのに、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で比較動作されてましたので、ちこっとグラフ化。

マシン 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

1
1 posted by (C)wacky

やっぱ、最新CPUは速いですねぇ。