为什么酸洗和加载非空列表会改变其大小?
Why does pickling and loading a non-empty list change its size?
我正在查看已腌制对象的大小,并注意到非空列表在取消腌制后会改变大小。它们增长了 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
,然后在未腌制时一项一项地附加项,每次容量耗尽时都会发生过度分配。
与手动 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),但模式是相同的; over-allocation(实现 O(1)
摊销 append
成本)影响增量/pickle
基于 list
的构造,但不影响 list
文字。
我正在查看已腌制对象的大小,并注意到非空列表在取消腌制后会改变大小。它们增长了 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
,然后在未腌制时一项一项地附加项,每次容量耗尽时都会发生过度分配。
与手动 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),但模式是相同的; over-allocation(实现 O(1)
摊销 append
成本)影响增量/pickle
基于 list
的构造,但不影响 list
文字。