🔖

pythonでcsv処理の速度比較

2021/06/28に公開

こんにちは。ヤギユキ(@yagiyuki06)です。
今回は、pythonのcsvファイルの読み込み・書き込み速度を比較しました。

比較手法は以下の3つです。

  • 標準関数のみ
  • csvモジュール
  • pandas

実行環境は、Google ColaboratoryでGPUは使わずに検証してます。
結果は最後のまとめに書いてあります。

下準備

まず検証用のcsvファイルを作成します。

# csvの行数 100万件
N=1000000
# N×5のcsvファイルを作成
with open('input.csv', 'w') as f:
    for i in range(N):
        l = []
        for j in range(5):
            s = '{}_{}'.format(i, j)
            l.append(s)
        f.write(",".join(l) + '\n')

標準関数のみ

読み込み

%%time

out_l = []

with open('input.csv') as in_f:
    for s in in_f:
        row = s.strip().split(',')
        out_l.append(row)
CPU times: user 1.79 s, sys: 275 ms, total: 2.06 s
Wall time: 1.99 s

書き込み

%%time

with open('output.csv', 'w') as out_f:
    for row in out_l:
        out_f.write(",".join(row) + '\n')
CPU times: user 452 ms, sys: 60.1 ms, total: 512 ms
Wall time: 516 ms

csvモジュール

読み込み

%%time

with open('input.csv') as csvfile:
    reader = csv.reader(csvfile)
    out_l = [row for row in reader]
CPU times: user 1.76 s, sys: 256 ms, total: 2.01 s
Wall time: 1.97 s

書き込み

%%time

with open('output.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    for row in out_l:
        writer.writerow(row)
CPU times: user 1.31 s, sys: 66.8 ms, total: 1.37 s
Wall time: 1.38 s

pandas

読み込み

%%time

df = pd.read_csv('input.csv', delimiter=',', names=[str(i) for i in range(5)])
CPU times: user 2.33 s, sys: 192 ms, total: 2.52 s
Wall time: 2.51 s

書き込み

%%time

df.to_csv('output.csv', index=False, header=False)
CPU times: user 2.2 s, sys: 81.8 ms, total: 2.28 s
Wall time: 2.29 s

まとめ

結果をまとめると以下のようになりました。

標準関数のみ csvモジュール pandas
読み込み 1.99 s 1.97 s 2.51s
書き込み 516 ms 1.38 s 2.29s

処理速度を優先するなら標準関数を使うのが良さそうです。

読み込み・書き込みともにpandasが一番遅いという結果になりました。
高機能であるがゆえに処理速度はどうしても落ちるようです。
高い処理速度が求められるシステムであれば、使わないほうがよいかもしれないですね。

以上です。

Discussion