RubyとPythonで1000万個のリストを作成してみた

RubyPythonの処理速度を測定するために、1000万個のリストを作成するプログラムを書いていると発見があったので、試したことと結果をブログにまとめました。

 

 

試したこと

RubyPythonで書いた以下のプログラムの速度を計測しました。

 

Ruby:メソッド版

リスト追加専用のメソッドを利用した場合

LIST_MAX = 1000*1000*10
list = []
(1..LIST_MAX).each do |n|
  list.push(true)
end

 

Ruby演算子

演算子を利用した場合

LIST_MAX = 1000*1000*10
list = []
(1..LIST_MAX).each do |n|
  list += [true]
end

 

Python:メソッド版

専用のメソッドを利用した場合

LIST_MAX = 1000*1000*10
list = []
for x in range(LIST_MAX):
  list.append(True)

 

Python演算子

演算子を利用した場合

LIST_MAX = 1000*1000*10
list = []
for x in range(LIST_MAX):
  list += [True]

 

Python:リスト内包表記版

リスト内包表記を利用した場合

LIST_MAX = 1000*1000*10
list = [True for x in range(LIST_MAX)]

 

計測結果

timeコマンドのuser項目を使って10回の計測結果を集計すると、下表(単位は秒です)のようになりました。

集計
項目
Ruby Python
メソッド 演算子(注) メソッド 演算子 リスト内包
表記
平均値 0.987 測定断念 1.548 1.784 0.631
最大値 1.029 測定断念 1.613 1.822 0.674
最小値 0.970 測定断念 1.506 1.755 0.618
中央値 0.983 測定断念 1.547 1.789 0.629

(注)Ruby演算子版については、1000万個のリスト作成が35分経過しても終わらなかったので測定を断念しました。試しに10万個のリスト作成時の計測を行うと、中央値が11.623秒でした。

 

Pythonはメソッド版と演算子版でそこまで差がないのに対して、Rubyは両極端な結果となってしまいました。リストへの追加を演算子で行うと遅くなるということは、文字列操作にも同じことが言えそうな気がしてなりません。

 

最後に

今回の実験結果より、リスト操作は専用のメソッドを使うべきだということが分かりました。

 

以上です。

ここまで読んでいただき、ありがとうございました。