世間では、小学生でも使えるサブマシンガンであるRubyが断トツで遅いという誤解があるようなので、サブマシンガンで遊んでいるトンデモ初心者の一人としてこちらのサイトに載ってるnumpy使ったPythonのベンチマークをRuby + NArrayを使って書いてみました。
言語 計算時間(msec)
Python(Numpyあり) 167
Python(Numpyなし) 739
Ruby 4159
C言語(最適化なし) 185
C言語(最適化あり) 1
RubyはPython + Numpyより24倍遅い…のか?
① Python + Numpy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
N = 10000 import numpy as np def sumup(n): return np.arange(1, n + 1).sum() def main(): print("python with numpy start.") result = {} for count in range(1, N + 1): result[count - 1] = sumup(count) print("python with numpy end.") main() |
② Ruby + NArray
1 2 3 4 5 6 7 8 9 |
require 'narray' N = 10000 puts "ruby with narray start" NArray[1..N].cumsum.to_a puts "ruby with narray end" |
実行するとあら不思議、
Python + Numpy
real 0m0.162s
user 0m0.169s
sys 0m0.205s
Ruby + NArray
real 0m0.077s
user 0m0.050s
sys 0m0.030s
このように、Rubyの方がnumpyより2倍ぐらい速いですね(強引)
(もっともnumpyにもcumusumあるから、それ使えば多分NArrayよりも速いけどね)
その証拠に同じような書き方にするとPython + Numpy が Ruby + NArray の2倍ぐらい速いです。
さすがNumpy
③ 同じような感じで書いたRuby
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require 'narray' N = 10000 def sumup(n) NArray[1..n].sum end def main Array.new(N){|n| sumup(n+1)} end main |
real 0m0.262s
user 0m0.213s
sys 0m0.051s
それでもせいぜい2倍ぐらいですよん? 少なくともRubyだけ特別に遅いというのは誤解だと思う。
追記7/5:Rubyの書き方を修正したらもうちょっと速くなった