Python:为什么泡菜?

2024-05-14 17:03:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在用pickle,非常高兴,然后我看到了这篇文章:Don't Pickle Your Data

再往下看似乎是:

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

考虑到这些问题,你什么时候会用泡菜?哪些具体情况需要使用它?


Tags: 数据语言jsonyourdataispickle泡菜
3条回答

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

  • 快速简单的序列化,例如暂停和恢复长时间运行但简单的脚本。这里的问题都不重要,您只想按原样转储程序的状态,然后再加载它。
  • 向其他进程或计算机发送任意Python数据,如multiprocessing。安全问题可能适用(但大多数情况下不适用),通用性是绝对必要的,人类不必阅读它。

在其他情况下,这些缺点都不足以证明将内容映射到JSON或其他限制性数据模型的工作是正确的。也许你不需要人的可读性/安全性/跨语言兼容性,或者你可以不需要。记住,你不需要它。使用JSON是正确的™ 但权利并不总是等同于善。

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

Pickle具有方便的优点——它可以在不做额外工作的情况下序列化任意对象图,并且可以在相当广泛的Python类型上工作。尽管如此,在新代码中使用Pickle对我来说是不寻常的。使用JSON要干净得多。

我通常既不使用Pickle,也不使用JSON,但是MessagePack它既安全又快速,并且生成小尺寸的序列化数据。

另一个优势是可以与用其他语言编写的软件交换数据(当然对于JSON也是如此)。

相关问题 更多 >

    热门问题