だいぶ前の記事でpythonでcsvの読み込み→再書き出しの処理について言及した際、csvモジュールでの実行時間が22時間という驚異的な時間をたたき出してしまった件。
最近になって何も調査してないことを思い出したので、ちょっと自分のソースを見直してみた。
5分で原因が判明。
結論から言えば間違っていたのは私のコードの書き方であり、モジュール自体には何も悪いところはなかった。
csv_module_2.py
@profile
def main():
with open('data/sample.csv', mode='r') as f:
with open('data/csv_module_output_2.csv', mode='w') as output:
reader = csv.reader(f)
writer = csv.writer(output)
for row in tqdm(reader):
writer.writerow(row)
if __name__ == '__main__':
start = datetime.now()
main()
print ("elapsed_time:{0}".format(datetime.now() - start))
'''
elapsed_time:0:29:05.530542
Filename: csv_module_2.py
Line # Mem usage Increment Line Contents
================================================
5 13.703 MiB 13.703 MiB @profile
6 def main():
7 13.703 MiB 0.000 MiB with open('data/sample.csv', mode='r') as f:
8 13.703 MiB 0.000 MiB with open('data/csv_module_output_2.csv', mode='w') as output:
9 13.703 MiB 0.000 MiB reader = csv.reader(f)
10 13.703 MiB 0.000 MiB writer = csv.writer(output)
11 13.895 MiB 0.180 MiB for row in tqdm(reader):
12 13.895 MiB 0.012 MiB writer.writerow(row)
'''
22時間?何の話だ。1000万行程度のcsvなら30分もあればお釣りがくる。
これが結論。
ファイルの読み出しにはモジュール使ってんのに、なぜか書き出し部分が生python。丁寧に読みだした行を分割してチマチマ出力。
そら時間かかりますよね。
で、せっかくなのでPandasのchunksizeもパターンを変えて実験しました。
結論から言うと、1000万行に対してchunksize=30000辺りが一番速く処理が終わった。
10万行だとかえってやや遅くなった。
pandasを使った処理の限界の時間というのもあろうけど、メモリに乗っかるのであれば最大行数に近いほど処理速度は上がると思っていたので少々予想外。(chunksize=10000000で最速だと思ってました)
うーんよくわからない。
とりあえず、前回の件については以上が結論です。
ちょっと関係ないけど
pythonの処理速度向上のためにCythonやNumbaという手段があるそうなので、用途について調べてみようと思います。