Pandas msgpack和pickle的区别

25

msgpack在Pandas中被认为是pickle的替代品。

根据Pandas文档关于msgpack的说明:

这是一种轻量级可移植二进制格式,类似于二进制JSON,非常高效地利用了空间,并在写入(序列化)和读取(反序列化)方面提供了良好的性能。

然而,我发现它的性能似乎不如pickle。

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

问题:除了pickle可能存在的安全问题,msgpack相较于pickle还有哪些好处?pickle目前是否仍然是首选的序列化数据方法,或者现在是否存在更好的替代方案?


3
看看这份相当全面的研究:http://matthewrocklin.com/blog/work/2015/03/16/Fast-Serialization/。当你有大量非平凡数据时,*msgpack*是相当棒的选择。 - Jeff
该博客页面已不存在。 - Jason S
1
@JasonS 试试这个链接:https://matthewrocklin.com/blog/work/2015/03/16/Fast-Serialization。奇怪的是,顶部链接只是一个尾随的斜杠“/”。 - Alexander
1个回答

32

Pickle更适合以下情况:

  1. 数值数据或使用缓冲区协议(如numpy数组),但只有在使用较新的protocol=时才是如此
  2. Python特定对象,例如类、函数等(尽管这里应该考虑使用cloudpickle

MsgPack更适合以下情况:

  1. 跨语言互操作性。它是JSON的替代品,具有一些改进
  2. 在文本数据和Python对象上的性能。在任何设置下,它比Pickle快得多。

正如@Jeff在上面指出的,这篇博客文章可能会引起您的兴趣


我说4D面板对pickle也不支持,这样说对吗? - firefly
@firefly:在pandas 0.18中,Panel4D是可被pickle的。但是请考虑使用xarray代替Panel4D。 - mtd
2
to_msgpack()在处理较大的数据时会崩溃,我不确定to_pickle()是否也会出现这种情况。 - Trideep Rath
“crashes for bigger size data”是什么意思 - 你能详细说明一下吗? - lucid_dreamer
4
截至2019年,Pandas对MsgPack的支持已被弃用,建议改用pyarrow代替。 - bastibe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接