唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

MessagePackとcPickleの速度を比べてみた

MessagePackとcPickleはデータのシリアライズに使われるライブラリです。

MessagePackとcPickleの速度比較は↑の記事にありますが、cPickleは↓の記事のようにプロトコルバージョンによる速度の違いがあるので、最速のプロトコル2と比較してみました。
Pythonのpickle.dumpに3番目の引数がある話 - 西尾泰和のはてなダイアリー

やったこと

numpyで5000x5000の行列を作って、それをそれぞれのライブラリでdumpとloadを10回ずつやって平均を出す。

結果

(秒) MesssagePack cPickle
Dump 6.60 3.71
Load 0.81 3.60

条件にもよると思いますが、どっちかが圧倒的に速いとは言えなさそうな結果になりました。

ソースコード

import timeit

pickle_setup = """
import numpy as np
import cPickle

array = np.empty([5000, 5000])
"""

pickle_dump = """
with open('pickle.time', 'w') as time:
    cPickle.dump(array, time, 2)
"""

pickle_load = """
with open('pickle.time', 'w') as time:
    cPickle.dump(array, time, 2)
"""


msgpack_setup = """
import numpy as np
import msgpack

array = np.empty([5000, 5000])
"""

msgpack_dump = """
with open('msgpack.time', 'w') as time:
    msgpack.dump(array, time)
"""

msgpack_load = """
with open('msgpack.time', 'r') as time:
    msgpack.load(time)
"""


print 'cPickle Dump:', timeit.timeit(pickle_dump, pickle_setup, number=10) / 10
print 'cPickle Load:', timeit.timeit(pickle_load, pickle_setup, number=10) / 10

print 'msgpack Dump:', timeit.timeit(msgpack_dump, msgpack_setup, number=10) / 10
print 'msgpack Load:', timeit.timeit(msgpack_load, msgpack_setup, number=10) / 10