性能測定
前回のネタの続き
俺がえいやとやってみたnumpy.array.T使う場合と、コメントもらったzip使う場合とで性能を比べてみた。
入力は1000行1000列の1M.csvと、5000行5000列の25M.csv。
方法1
import sys
import numpy
def csvt_1(fnin, fnout):
fin = open(fnin, "r")
fout = open(fnout, "w")
for line in numpy.array([s.strip('\n').split(',') for s in fin]).T:
fout.write(",".join(line) + "\n")
fin.close()
fout.close()
方法2
import sys
def csvt_2(fnin, fnout):
fin = open(fnin, "r")
fout = open(fnout, "w")
for line in zip(*[s.strip('\n').split(',') for s in fin]):
fout.write(','.join(line) + '\n')
fin.close()
fout.close()
測定結果(IPythonでの%time %run)
方法1 1M.csv:約500ms 25M.csv:約14s
方法2 1M.csv:約250ms 25M.csv:約11s
何度か計ったけどだいたい同じ。zipの勝ち。
これは何だろう。zipは遅延評価がいい感じに効いているとかだろうか。
ともあれ有意義な結果が得られた。
ただ残念ながら
このコードを試すきっかけとなった、同僚から話題が出たデータはサイズが約40GB。
それに対しては今回の方法は使えなさそうだったので、これとは別にC#でアプリ書いて解決した。