gpt4 book ai didi

python - 为什么 pickle 和加载非空列表会改变其大小?

转载 作者:行者123 更新时间:2023-12-03 10:08:25 25 4
gpt4 key购买 nike

我正在查看已 pickle 对象的大小,并注意到非空列表在取消 pickle 后会改变大小。它们增长了 24 个字节。空列表的大小保持不变。如果我使用 getsizeof 方法 here , 然后它表明嵌套列表也会发生同样的情况,并且每个非空列表的大小都会增加 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 list s 不同于 list 的“从头开始构建”过程文字。当你有一个文字 list ,它会精确地调整初始大小。当它从 pickle 重建时, 它会创建一个空的 list ,然后在项目未被 pickle 时一个接一个地追加项目,每次容量耗尽时都会发生过度分配。

与手动 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))

Try it online!

在 TIO 上产生:

Literal: 80
Incremental: 104
Pickled: 104

数字因解释器而异(我自己的 Python 构建得到 64、88、88),但模式是相同的;过度分配(实现 O(1) 摊销 append 成本)影响增量/pickle基于 list build ,但不是list文字。

关于python - 为什么 pickle 和加载非空列表会改变其大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63936555/

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