RubyとPythonで1000万個のリストを作成してみた
RubyとPythonの処理速度を測定するために、1000万個のリストを作成するプログラムを書いていると発見があったので、試したことと結果をブログにまとめました。
試したこと
RubyとPythonで書いた以下のプログラムの速度を計測しました。
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は両極端な結果となってしまいました。リストへの追加を演算子で行うと遅くなるということは、文字列操作にも同じことが言えそうな気がしてなりません。
最後に
今回の実験結果より、リスト操作は専用のメソッドを使うべきだということが分かりました。
以上です。
ここまで読んでいただき、ありがとうございました。