Python:为什么泡菜?

emh*_*emh 26 python pickle

我一直在使用泡菜,非常高兴,然后我看到这篇文章:不要腌制你的数据

进一步阅读它似乎:

我已经切换到将数据保存为JSON,但我想了解最佳实践:

鉴于所有这些问题,你何时会使用泡菜?具体情况需要什么?

小智 19

Pickle是不安全的,因为它通过调用任意函数来构造任意Python对象.但是,这也使它能够序列化几乎所有Python对象,没有任何样板或甚至白/黑列表(在常见情况下).对于某些用例来说,这是非常理想的:

  • 快速简便的序列化,例如暂停和恢复长时间运行但简单的脚本.这里没有任何问题,你只是想按原样转储程序的状态并在以后加载它.
  • 将任意Python数据发送到其他进程或计算机,如multiprocessing.安全问题可能适用(但大多数情况下不适用),普遍性是绝对必要的,人类不必阅读它.

在其他情况下,没有任何缺点足以证明将您的东西映射到JSON或其他限制性数据模型的工作.也许你不希望需要人类可读性/安全性/跨语言兼容性,或者你可以不用.记住,你不需要它.使用JSON将是正确的事情但权利并不总是等于好.

你会注意到我完全忽略了"缓慢"的缺点.那是因为它有部分误导性:对于完全符合JSON模型(字符串,数字,数组,地图)的数据,Pickle确实更慢,但如果您的数据类似,那么您应该出于其他原因使用JSON.如果您的数据不是那样(非常可能),您还需要考虑将对象转换为JSON数据所需的自定义代码,以及将JSON数据转换回您的JSON数据所需的自定义代码对象.它增加了工程工作量和运行时间开销,必须根据具体情况进行量化.


Sne*_*tel 5

Pickle 具有方便的优势——它可以在没有额外工作的情况下序列化任意对象图,并且适用于相当广泛的 Python 类型。话虽如此,我在新代码中使用 Pickle 是不寻常的。JSON 使用起来更简洁。