为什么酸洗和加载非空列表会改变其大小?

2024-06-02 07:08:19 发布

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

我查看了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))

Tags: 对象方法testimport列表字节aswith
1条回答
网友
1楼 · 发布于 2024-06-02 07:08:19

pickledlist的重建过程不同于list文本的“从头开始构建”过程。当您有一个文本list时,它会根据初始大小精确地调整它的大小。当它从pickle重建时,会创建一个空的list,然后在项目取消勾选时逐个追加项目,每次容量耗尽时都会发生过度分配

与手动构建的append{}相比,您可以看到大小的差异(因为对于所有实际目的,取消勾选也是这样做的):

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构造,但不影响list文本

相关问题 更多 >