【问题标题】:What are the basic difference between pickle and yaml in Python?Python中pickle和yaml的基本区别是什么?
【发布时间】:2013-09-24 22:53:46
【问题描述】:

我对 Python 很幼稚。但是,我开始知道两者都被用于序列化和反序列化。那么,我只想知道它们之间的所有基本区别是什么?

【问题讨论】:

    标签: python python-2.7 serialization yaml pickle


    【解决方案1】:

    YAML 是一种语言中立的格式,可以很好地表示原始类型(int、string 等),并且在语言之间具有高度可移植性。类似于 JSON、XML 或纯文本文件;只是混合了一些有用的格式约定——事实上,YAML 是 JSON 的超集。

    Pickle 格式是 Python 特有的,可以表示多种数据结构和对象,例如Python 列表、集合和字典; Python 类的实例;以及这些对象列表的组合;包含包含列表的dicts的对象;等等

    所以基本上:

    • YAML 以可移植语言的方式表示简单的数据类型和结构
    • pickle 可以表示复杂的结构,但以非语言可移植的方式

    还有更多,但您要求的是“基本”区别。

    【讨论】:

    • 谢谢,请随时向我推荐有关 pickle 和 yaml 的更多信息。比如,我们应该在哪些参数上选择其中一个进行数据序列化和所有(除了这种语言可移植性)?
    • @nirprat 对序列化/反序列化速度至关重要吗?可读性怎么样,你需要以人类可读的形式存储那些序列化的文件吗?
    • YAML的结构遵循Python的缩进概念;每个级别都由一个缩进表示,并且没有结束标记。与以<something> 开始一个块的XML 相比,您应该以</something> 结束同一个块。由于这个原因,YAML 比 XML 或 JSON 更容易复制、剪切和粘贴。最简单的经验法则是,如果您只使用原始数据类型,请选择 YAML(或 JSON),因为它们是人类可读、可编辑和可移植的;但如果您使用的是非原始数据类型(例如 Python 对象),则必须使用 Pickle。
    • 通过 API 调用,我正在收集一些将被大量使用的统计信息。所以,就我而言,我有点担心速度,所以我试图将这些数据转储到文件中并缓存它,而不是转储到数据库中。
    • @nirprat 如果速度很重要,请考虑使用cPickle 而不是pickle,它会快得多。
    【解决方案2】:

    pickle是一种特殊的python序列化格式,当python对象转换为字节流并返回时:

    “Pickling”是 Python 对象层次结构的过程 转换为字节流,“unpickling”是相反的 操作,从而将字节流转换回对象 层次结构。

    重点是它是python特有的。

    另一方面,YAML 是语言无关和人类可读的序列化格式。

    仅供参考,如果您在这些格式之间进行选择,请考虑:

    • 序列化/反序列化速度(见cPickle模块)
    • 您需要以人类可读的形式存储序列化文件吗?
    • 你要序列化什么?例如,如果它是一个特定于 python 的复杂数据结构,那么你应该使用 pickle。

    另见:

    【讨论】:

    • 所以,我必须缓存一些统计信息,其他程序将使用这些统计信息进行统计操作,而不关心人类的可读性。
    • @nirprat 如果这些序列化的统计信息将被非 python 程序使用,那么pickle 不是一种方法:在与语言无关的格式之间进行选择:YAMLJSONXML , CSV 等。看看 ujsonsimplejson 模块 - 与 json 模块相比,它们相当快。
    【解决方案3】:

    如果一个人读取文件对你来说并不重要,但你只需要保存文件,然后读取它,然后使用pickle。它速度更快,并且二进制文件的重量更轻。

    如上所述,YAML 文件更具可读性,但速度较慢且体积较大。

    我已经测试了我的应用程序。我测量了将对象上传和下载到文件的时间以及文件的大小。

    Serialization/deserialization method Average time, s Size of file, kB
    PyYAML 1.73 1149.358
    pickle 0.004 690.658

    如您所见,yaml 重 1.67 倍。而且慢了 432.5 倍。

    P。 S. 这是我的数据。在您的情况下,可能会有所不同。但这足以进行比较。

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2015-10-21
      • 2010-11-10
      • 2013-08-26
      • 2013-12-26
      • 1970-01-01
      相关资源
      最近更新 更多