列表和系统大小不一致



我读到python列表应该占用64个字节,并且列表中的每个条目都应该"花费"8个额外的字节。我决定测试一下。但是,在测试此功能时,我发现这取决于您如何将项目添加到列表中。为什么下面的代码中ob1obj2sys.getsizeof不一致?

import sys
test1 = 'This is a string.'
obj1 = []
obj2 = ['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', '.']
obj3 = list(test1)
for i in range(len(test1)):
    obj1.append(test1[i])
print(sys.getsizeof(obj1))
print(obj1)
print(sys.getsizeof(obj2))
print(obj2)
print(sys.getsizeof(obj3))
print(obj3)
>>>264
>>>['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', '.']
>>>200
>>>['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', '.']
>>>264
>>>['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', '.']

obj2报告了我预期的大小(64+8*17=200(。使用 append -函数后的开销是多少,构造列表后是否可以以某种方式消除该开销?

我已经在这里阅读了这个相关主题,但我认为他们的答案与另一个似乎与熊猫有关

开销

是由于Python在list中分配了一些额外的"插槽",以便您能够例如 append到列表中,无需分配新内存并将旧列表复制到该列表。

您可以通过将一些值附加到列表中来查看这一点:

>>> obj1.append('!')
>>> print(sys.getsizeof(obj1))
264
>>> obj2.append('!')
>>> print(sys.getsizeof(obj2))
272

如您所见,可以在不增长的情况下添加到obj1,而obj2需要分配一个新的"块"。

这是一个实现细节,但当您动态增加列表的大小时,该行为通常很好,因为它将减少程序的内存碎片(并提高速度(。

最新更新