列表和sys.getsizeof系统不一致

2024-10-02 20:38:53 发布

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

我已经读到python列表应该占用64个字节,并且列表中的每个条目应该额外占用8个字节。我决定试试这个。但是,在测试时,我发现这取决于如何将项添加到列表中。为什么sys.getsizeoffor ob1obj2在下面的代码中不一致?你知道吗

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-函数后的开销是多少?在构建列表后,是否可以以某种方式消除该开销?你知道吗

我已经通读了这个相关的主题,但我认为它们的答案与另一个似乎与熊猫有关的主题不一样。你知道吗


Tags: 代码主题列表字节sys条目printtest1
1条回答
网友
1楼 · 发布于 2024-10-02 20:38:53

开销是由于Python在list中分配了一些额外的“插槽”,以便您能够(例如)append到列表,而不需要在那里分配新内存和复制旧列表。你知道吗

您可以通过在列表中添加一些值来了解这一点:

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

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

如您所见,添加到obj1是可能的,而obj2需要分配一个新的“块”。你知道吗

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

相关问题 更多 >