python - 为什么腌制和加载非空列表会改变其大小?
问题描述
我正在查看腌制对象的大小,并注意到非空列表在取消腌制后会改变大小。它们增大了 24 个字节。空列表的大小保持不变。如果我在这里getsizeof
使用该方法,那么它表明嵌套列表也会发生同样的情况,并且每个非空列表的大小会增加 24 个字节。
这种增长是如何发生的?
一个小例子:
import pickle
import sys
li = [1]
with open('test.p', 'wb') as f:
pickle.dump(li, f)
print (getsize(li), sys.getsizeof(li))
with open('test.p', 'rb') as f:
li2 = pickle.load(f)
print (sys.getsizeof(li2))
解决方案
pickle
d s的重建过程与文字list
的“从头开始构建”过程不同。list
当你有一个文字list
时,它会精确地调整它的初始大小。当它从 a 重建时pickle
,它会创建一个空的list
,然后在它们未腌制时一个接一个地附加,每次容量耗尽时都会发生过度分配。
append
您会看到与手动构建的比较的大小差异list
(因为出于所有实际目的,这也是 unpickling 所做的):
import pickle
import sys
literal = [1]
incremental = []
incremental.append(1)
pickled = pickle.loads(pickle.dumps(literal, -1))
print("Literal:", sys.getsizeof(literal))
print("Incremental:", sys.getsizeof(incremental))
print("Pickled:", sys.getsizeof(pickled))
在 TIO 上产生:
Literal: 80
Incremental: 104
Pickled: 104
数字因解释器而异(我自己的 Python 版本有 64、88、88),但模式是一样的;过度分配(以实现O(1)
摊销append
成本)影响增量/pickle
基于list
构造,但不影响list
文字。
推荐阅读
- wxpython - 使用 wxPython 和 CEFPython 的具有多个选项卡的 Web 浏览器在 Windows 10 上不起作用
- java - 供应商提供的 SSL 证书中 CN 的值应该是多少?
- api - 将 Clockify 数据加载到 Power BI
- xamarin.forms - 列表视图可见性更改中的xamarin复选框
- c - C - 哈希表清除建议
- c# - SendKeys.SendWait 花费太多时间 C#
- python - Tarfile 项目的 Tkinter 树视图
- c - 商业软件中的内核模块问题
- git - 如何优化 2000GB Git 数据
- java - Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中