Python vs Ruby 演算コストの比較 @osamunmun
環境 ・Mac OS X Version10.7.4 ・CPU 2.2GHz Intel Core i7 ・Memory 4GB ・Python 2.7.1 vs ruby 1.9.2p290 ・実行測定結果は5回実行したうち、最大値、 最 小値を取り除いた3つの値の平均を利用 ・空ループの実行結果を測定し除いた
1, i = i2  (intの代入) Python Ruby 実行結果:0.055(s) 実行結果:0.0095(s) 1回あたり:0.055(μs) 1回あたり:0.0095(μs) ・Rubyの方がPythonより一桁速いことに違和感があるが、計測方法を確認しても特に間違いは無さそうなの でバックエンドで何か異なる処理をしているのかもしれない。 。
2, i = i2+i3  (intの加算) Python Ruby 実行結果:0.11(s) 実行結果:0.015(s) 1回あたり:0.11(μs) 1回あたり:0.015(μs)
3,i=i2/i3 (intの除算) Python Ruby 実行結果:0.12(s) 実行結果:0.028(s) 1回あたり:0.12(μs) 1回あたり:0.028(μs) ・Pythonは乗算とほぼ同じコストに対して、Rubyは2倍近いコストになっている。
4,i=i2%i3 (intの剰余) Python Ruby 実行結果:0.13(s) 実行結果:0.028(s) 1回あたり:0.13(μs) 1回あたり:0.028(μs)
5,f=f2 (floatの代入) Python Ruby 実行結果:0.055(s) 実行結果:0.012(s) 1回あたり:0.055(μs) 1回あたり:0.012(μs) ・Pythonはintの場合と同じコストであったが、Rubyは3割増となっている。
6,f=f2+f3 (floatの加算) Python Ruby 実行結果:0.11(s) 実行結果:0.059(s) 1回あたり:0.11(μs) 1回あたり:0.059(μs) ・Pythonはintの場合と同じコストであったが、Rubyは4倍となっている。
7,f=f2/f3 (floatの除算) Python Ruby 実行結果:0.10(s) 実行結果:0.058(s) 1回あたり:0.10(μs) 1回あたり:0.058(μs)
8,f=f2%f3 (floatの剰余) Python Ruby 実行結果:0.12(s) 実行結果:0.059(s) 1回あたり:0.12(μs) 1回あたり:0.059(μs)
9,intからfloatへの変換 Python Ruby 実行結果:0.26(s) 実行結果:0.082(s) 1回あたり:0.26(μs) 1回あたり:0.082(μs)
10,floatからintへの変換 Python Ruby 実行結果:0.28(s) 実行結果:0.042(s) 1回あたり:0.28(μs) 1回あたり:0.042(μs) ・Rubyはintからfloatの半分のコストとなった。
11,listへの挿入(n=1,000) Python Ruby 実行結果:0.00062(s) 実行結果:0.00026(s) 1回あたり:0.62(μs) 1回あたり:0.26(μs)
12,listへの挿入(n=10,000) Python Ruby 実行結果:0.037(s) 実行結果:0.018(s) 1回あたり:3.7(μs) 1回あたり:1.8(μs)
13,listへの挿入(n=100,000) Python Ruby 実行結果:3.57(s) 実行結果:2.18(s) 1回あたり:35.7(μs) 1回あたり:21.8(μs)
14,listの参照(n=1,000) Python Ruby 実行結果:0.0004(s) 実行結果:0.00005(s) 1回あたり:0.4(μs) 1回あたり:0.05(μs) ・Rubyの性能がPythonを1桁上回った。速すぎる気がする。
15,listの参照(n=10,000) Python Ruby 実行結果:0.018(s) 実行結果:0.0005(s) 1回あたり:1.8(μs) 1回あたり:0.05(μs) ・Rubyの1回あたりの性能がn=1000と比べて劣化していない。
16,listの参照(n=100,000) Python Ruby 実行結果:2.2(s) 実行結果:0.0044(s) 1回あたり:22.2(μs) 1回あたり:0.044(μs) ・Rubyの1回あたりの性能がn=1000と比べて劣化していない。Pythonは指数関数的にコストが 増加しており、listのアルゴリズムが異なることが伺える。
17,Hashの生成(n=10,000) Python Ruby 実行結果:0.0014(s) 実行結果:0.0033(s) 1回あたり:0.14(μs) 1回あたり:0.33(μs) ・初めてPythonがRubyの性能を上回った。
18,Hashの参照(n=10,000) Python Ruby 実行結果:0.0008(s) 実行結果:0.0011(s) 1回あたり:0.08(μs) 1回あたり:0.11(μs) ・PythonがRubyの性能を上回り、作成と比べた参照の性能値はどちらも同程度だった。
19,正規表現のmatch Python Ruby 実行結果:0.002(s) 実行結果:0.0005(s) 1回あたり:2.0(μs) 1回あたり:0.5(μs) ・RubyがPythonより一桁速い。
20, 条件判定 Python Ruby 数字=>実行結果:0.07(s) 数字=>実行結果:0.009(s) 1回あたり:0.07(μs) 1回あたり:0.009(μs) 文字=>実行結果:0.13(s) 文字=>実行結果:0.032(s) 1回あたり:0.13(μs) 1回あたり:0.032(μs) ・RubyがPythonより一桁速い。
21, ソート Python Ruby n=1000=>実行結果:0.025(s) n=1000=>実行結果:0.0067(s) 1回あたり:25(μs) 1回あたり:6.7(μs) n=10000=>実行結果:2.44(s) n=10000=>実行結果:0.59(s) 1回あたり:244(μs) 1回あたり:59(μs) n=100000=>実行結果:282(s) n=100000=>実行結果:58(s) 1回あたり:2820(μs) 1回あたり:580(μs) ・RubyがPythonより一桁速い。

Python vs ruby

  • 1.
  • 2.
    環境 ・Mac OS XVersion10.7.4 ・CPU 2.2GHz Intel Core i7 ・Memory 4GB ・Python 2.7.1 vs ruby 1.9.2p290 ・実行測定結果は5回実行したうち、最大値、 最 小値を取り除いた3つの値の平均を利用 ・空ループの実行結果を測定し除いた
  • 3.
    1, i =i2  (intの代入) Python Ruby 実行結果:0.055(s) 実行結果:0.0095(s) 1回あたり:0.055(μs) 1回あたり:0.0095(μs) ・Rubyの方がPythonより一桁速いことに違和感があるが、計測方法を確認しても特に間違いは無さそうなの でバックエンドで何か異なる処理をしているのかもしれない。 。
  • 4.
    2, i =i2+i3  (intの加算) Python Ruby 実行結果:0.11(s) 実行結果:0.015(s) 1回あたり:0.11(μs) 1回あたり:0.015(μs)
  • 5.
    3,i=i2/i3 (intの除算) Python Ruby 実行結果:0.12(s) 実行結果:0.028(s) 1回あたり:0.12(μs) 1回あたり:0.028(μs) ・Pythonは乗算とほぼ同じコストに対して、Rubyは2倍近いコストになっている。
  • 6.
    4,i=i2%i3 (intの剰余) Python Ruby 実行結果:0.13(s) 実行結果:0.028(s) 1回あたり:0.13(μs) 1回あたり:0.028(μs)
  • 7.
    5,f=f2 (floatの代入) Python Ruby 実行結果:0.055(s) 実行結果:0.012(s) 1回あたり:0.055(μs) 1回あたり:0.012(μs) ・Pythonはintの場合と同じコストであったが、Rubyは3割増となっている。
  • 8.
    6,f=f2+f3 (floatの加算) Python Ruby 実行結果:0.11(s) 実行結果:0.059(s) 1回あたり:0.11(μs) 1回あたり:0.059(μs) ・Pythonはintの場合と同じコストであったが、Rubyは4倍となっている。
  • 9.
    7,f=f2/f3 (floatの除算) Python Ruby 実行結果:0.10(s) 実行結果:0.058(s) 1回あたり:0.10(μs) 1回あたり:0.058(μs)
  • 10.
    8,f=f2%f3 (floatの剰余) Python Ruby 実行結果:0.12(s) 実行結果:0.059(s) 1回あたり:0.12(μs) 1回あたり:0.059(μs)
  • 11.
    9,intからfloatへの変換 Python Ruby 実行結果:0.26(s) 実行結果:0.082(s) 1回あたり:0.26(μs) 1回あたり:0.082(μs)
  • 12.
    10,floatからintへの変換 Python Ruby 実行結果:0.28(s) 実行結果:0.042(s) 1回あたり:0.28(μs) 1回あたり:0.042(μs) ・Rubyはintからfloatの半分のコストとなった。
  • 13.
    11,listへの挿入(n=1,000) Python Ruby 実行結果:0.00062(s) 実行結果:0.00026(s) 1回あたり:0.62(μs) 1回あたり:0.26(μs)
  • 14.
    12,listへの挿入(n=10,000) Python Ruby 実行結果:0.037(s) 実行結果:0.018(s) 1回あたり:3.7(μs) 1回あたり:1.8(μs)
  • 15.
    13,listへの挿入(n=100,000) Python Ruby 実行結果:3.57(s) 実行結果:2.18(s) 1回あたり:35.7(μs) 1回あたり:21.8(μs)
  • 16.
    14,listの参照(n=1,000) Python Ruby 実行結果:0.0004(s) 実行結果:0.00005(s) 1回あたり:0.4(μs) 1回あたり:0.05(μs) ・Rubyの性能がPythonを1桁上回った。速すぎる気がする。
  • 17.
    15,listの参照(n=10,000) Python Ruby 実行結果:0.018(s) 実行結果:0.0005(s) 1回あたり:1.8(μs) 1回あたり:0.05(μs) ・Rubyの1回あたりの性能がn=1000と比べて劣化していない。
  • 18.
    16,listの参照(n=100,000) Python Ruby 実行結果:2.2(s) 実行結果:0.0044(s) 1回あたり:22.2(μs) 1回あたり:0.044(μs) ・Rubyの1回あたりの性能がn=1000と比べて劣化していない。Pythonは指数関数的にコストが 増加しており、listのアルゴリズムが異なることが伺える。
  • 19.
    17,Hashの生成(n=10,000) Python Ruby 実行結果:0.0014(s) 実行結果:0.0033(s) 1回あたり:0.14(μs) 1回あたり:0.33(μs) ・初めてPythonがRubyの性能を上回った。
  • 20.
    18,Hashの参照(n=10,000) Python Ruby 実行結果:0.0008(s) 実行結果:0.0011(s) 1回あたり:0.08(μs) 1回あたり:0.11(μs) ・PythonがRubyの性能を上回り、作成と比べた参照の性能値はどちらも同程度だった。
  • 21.
    19,正規表現のmatch Python Ruby 実行結果:0.002(s) 実行結果:0.0005(s) 1回あたり:2.0(μs) 1回あたり:0.5(μs) ・RubyがPythonより一桁速い。
  • 22.
    20, 条件判定 Python Ruby 数字=>実行結果:0.07(s) 数字=>実行結果:0.009(s) 1回あたり:0.07(μs) 1回あたり:0.009(μs) 文字=>実行結果:0.13(s) 文字=>実行結果:0.032(s) 1回あたり:0.13(μs) 1回あたり:0.032(μs) ・RubyがPythonより一桁速い。
  • 23.
    21, ソート Python Ruby n=1000=>実行結果:0.025(s) n=1000=>実行結果:0.0067(s) 1回あたり:25(μs) 1回あたり:6.7(μs) n=10000=>実行結果:2.44(s) n=10000=>実行結果:0.59(s) 1回あたり:244(μs) 1回あたり:59(μs) n=100000=>実行結果:282(s) n=100000=>実行結果:58(s) 1回あたり:2820(μs) 1回あたり:580(μs) ・RubyがPythonより一桁速い。