gpt4 book ai didi

python - 编码转储更快,cPickle 加载更快

转载 作者:IT老高 更新时间:2023-10-28 20:57:20 24 4
gpt4 key购买 nike

我正在实现一个需要序列化和反序列化大型对象的程序,所以我使用 picklecPicklemarshal 进行了一些测试> 模块选择最佳模块。一路走来,我发现了一些非常有趣的事情:

我在字典、元组、整数、 float 和字符串列表上使用 dumps 然后 loads(针对每个模块)。

这是我的基准测试的输出:

DUMPING a list of length 7340032
----------------------------------------------------------------------
pickle => 14.675 seconds
length of pickle serialized string: 31457430

cPickle => 2.619 seconds
length of cPickle serialized string: 31457457

marshal => 0.991 seconds
length of marshal serialized string: 117440540

LOADING a list of length: 7340032
----------------------------------------------------------------------
pickle => 13.768 seconds
(same length?) 7340032 == 7340032

cPickle => 2.038 seconds
(same length?) 7340032 == 7340032

marshal => 6.378 seconds
(same length?) 7340032 == 7340032

因此,从这些结果中我们可以看到 marshal 在基准的 dumping 部分中非常快:

14.8x times faster than pickle and 2.6x times faster than cPickle.

但是,让我大吃一惊的是,marshalloading 部分比 cPickle 慢得多:

2.2x times faster than pickle, but 3.1x times slower than cPickle.

而对于 RAM,marshal 性能同时 loading 也非常低效:

Ubuntu System Monitor

我猜为什么用 marshal 加载这么慢的原因与它的序列化字符串的长度有关(比 pickle cPickle)。

  • 为什么 marshal 转储更快而加载更慢?
  • 为什么marshal序列化的字符串这么长?
  • 为什么 marshal 的加载在 RAM 中如此低效?
  • 有没有办法提高 marshal 的加载性能?
  • 有没有办法将 marshal 快速转储与 cPickle 快速加载合并?

最佳答案

cPickle具有比 marshal 更智能的算法并且能够做一些技巧来减少大物体使用的空间。这意味着它的解码速度会更慢,但编码速度会更快,因为结果输出更小。marshal 非常简单,直接按原样序列化对象,而不做任何进一步的分析。这也解释了为什么 marshal 加载效率如此之低,它只需要做更多的工作——比如从磁盘读取更多数据——才能做与 cPickle 相同的事情>.

marshalcPickle 最终是真正不同的东西,你不能真正获得快速保存和快速加载,因为快速保存意味着分析数据结构更少意味着将大量数据保存到磁盘。

关于 marshal 可能与其他版本的 Python 不兼容,您通常应该使用 cPickle:

"This is not a general “persistence” module. For general persistence and transfer of Python objects through RPC calls, see the modules pickle and shelve. The marshal module exists mainly to support reading and writing the “pseudo-compiled” code for Python modules of .pyc files. Therefore, the Python maintainers reserve the right to modify the marshal format in backward incompatible ways should the need arise. If you’re serializing and de-serializing Python objects, use the pickle module instead – the performance is comparable, version independence is guaranteed, and pickle supports a substantially wider range of objects than marshal." (the python docs about marshal)

关于python - 编码转储更快,cPickle 加载更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com