Pandas msgpack 与 pickle

Pandas msgpack vs pickle

msgpack in Pandas 应该是 pickle.

的替代品

根据 Pandas docs on msgpack:

This is a lightweight portable binary format, similar to binary JSON, that is highly space efficient, and provides good performance both on the writing (serialization), and reading (deserialization).

但是,我发现它的性能似乎无法与 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 是否仍然是序列化数据的首选方法,或者目前是否存在更好的替代方法?

Pickle 更适合以下情况:

  1. 数值数据或任何使用缓冲协议(numpy 数组)的数据(尽管只有当您使用较新的 protocol=
  2. Python 特定对象,例如 类、函数等。(尽管您应该在此处查看 cloudpickle

MsgPack 更适用于以下内容:

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

正如上面提到的@Jeff this blogpost 可能会引起兴趣