Pandas msgpack vs pickle

Ale*_*der 21 python msgpack pandas

msgpack在熊猫应该是一个替代品pickle.

根据msgpack上Pandas文档:

这是一种轻量级的可移植二进制格式,类似于二进制JSON,具有很高的空间效率,并且在写入(序列化)和读取(反序列化)方面都提供了良好的性能.

然而,我发现它的性能似乎与咸菜不相上下.

df = pd.DataFrame(np.random.randn(10000, 100))

>>> %timeit df.to_pickle('test.p')
10 loops, best of 3: 22.4 ms per loop

>>> %timeit df.to_msgpack('test.msg')
10 loops, best of 3: 36.4 ms per loop

>>> %timeit pd.read_pickle('test.p')
100 loops, best of 3: 10.5 ms per loop

>>> %timeit pd.read_msgpack('test.msg')
10 loops, best of 3: 24.6 ms per loop
Run Code Online (Sandbox Code Playgroud)

问题: 除了泡菜的潜在安全问题,msgpack对pickle有什么好处?pickle仍然是序列化数据的首选方法,还是目前存在更好的替代方案?

MRo*_*lin 23

Pickle更适合以下情况:

  1. 数值数据或任何使用缓冲区协议的数据(numpy数组)(尽管只是在最近使用时protocol=)
  2. Python特定的对象,如类,函数等.(虽然在这里你应该看看cloudpickle)

MsgPack更适合以下情况:

  1. 跨语言互操作.它是JSON的替代品,有一些改进
  2. 在文本数据和Python对象上的性能.在任何情况下,这都是比Pickle更快的体面因素.

正如@Jeff上面提到的,这篇博文可能会引起人们的兴趣

  • 截至 2019 年,MsgPack 对 Pandas 的支持已被弃用,建议[使用 pyarrow 代替](https://github.com/pandas-dev/pandas/issues/27722)。 (4认同)
  • to_msgpack() 因更大的数据而崩溃,我不确定 to_pickle() (2认同)