なんとなくinput()
を避けてsys.stdin
を使ってきたけど実際どっちがいいのか?を速度とコード量的に比較してみました。追加でfileinputも比較します。
###結論 sys.stdinを使え
動作速度は
input() <<< fileinput < sys.stdin
###比較方法
- オンライン実行環境のpaiza.io を使用(特に意味は無し)。
-
1 2 3 4
の様な数字+空白のフォーマットを1万行、標準入力として渡す。 -
time
を使って、標準入力をintに変換しlistに格納するまでの時間を計測。
#input()の動作速度
input()のコード例.py
data_all = [input().split() for i in range(10000)]#データ一括取得
data_list = [[int(s) for s in line]for line in data_all] #データのint化
#for line in data_all:
# data_list.append([int(s) for s in line])
動作時間: 約21.1[msec]
#sys.stdinの動作速度
sysのコード例.py
data_list = [ [int(s) for s in line.split()] for line in sys.stdin ]
#data_list = []
#for line in sys.stdin:
# data_list.append([int(s) for s in line.split()])
動作時間: 約10.5[msec]
#fileinputの動作速度
import fileinput
data_list = [ [int(s) for s in line.split()] for line in fileinput.input() ]
動作時間: 約12.5[msec]
sysの方がコードもスッキリ
内包表記に変えました。input()使うとどうしても2行になっちゃうかな...
動作速度はinput()の方が倍近く遅いですね。他の方の記事を見ていると、10倍以上差が出たりする様です。sys
を使った方が色々と良さそうですね。
追加で試したfileinputですが、sys.stdinほど速くもないかなぐらいでした。
###int変換なしの場合
input()の場合、約12.9[msec]
sys.stdinの場合、約5.5[msec]
fileinputの場合、約7.5[msec]
int変換って意外と時間かかりますね。動作速度はやっぱりsys.stdinが速そうです。