やること
繰り返し同じデータを扱うとよくファイルに保存しておくが、.pickleと.npyのどっちを使うべきなのか深く考えたことがなかったので比較してみた。比較ポイントは読み込み/書き込み速度。
環境
python3.6(Anaconda)
比較するもの
- pickle(protocol=4)
- _pickle(protocol=4)
- numpy with
比較
適当にndarrayの行列を作って保存して読み込んだ。np.saveは書き方がシンプル
データ作成
import numpy as np
data = np.random.rand(1000, 1000, 3, 500)
保存時間の計測
# numpy
start = time.time()
np.save('npsave', data)
print('numpy save:', time.time() - start)
# pickle
start = time.time()
with open('picklesave.pickle', mode='wb') as f:
pickle.dump(data, f, protocol=4)
print('pickle save:', time.time() - start)
# _pickle
start = time.time()
with open('cpicklesave.pickle', mode='wb') as f:
_pickle.dump(data, f, protocol=4)
print('_pickle save:', time.time() - start)
読み込み時間の計測
# numpy
start = time.time()
data = np.load('npsave.npy')
print('numpy load:', time.time() - start)
# pickle
start = time.time()
with open('picklesave.pickle', mode='rb') as f:
data = pickle.load(f)
print('pickle load:', time.time() - start)
# _pickle
start = time.time()
with open('cpicklesave.pickle', mode='rb') as f:
data = _pickle.load(f)
print('_pickle load:', time.time() - start)
結果
形式 | 書き込み時間 [s] | 読み込み時間 [s] |
---|---|---|
numpy | 104 | 113 |
pickle | 154 | 175 |
_pickle | 194 | 168 |
書き込みも読み込みもnumpyが最速だった。_pickleはpickleよりも優秀だと思ってたがそこまで変わりがなかった。
今まで_pickle使ってましたがこれからはnp.save()つかいます。