Python 为什么列表的(深层)副本比原始列表消耗更多内存?
我知道Python 为什么列表的(深层)副本比原始列表消耗更多内存?,python,Python,我知道sys.getsizeof()返回容器(列表)本身的大小,而不考虑内容,因此我得到它返回与[0]、[None]和[“0”]相同的大小(72) 但是,为什么副本或深度副本需要更多内存来保存相同的数据(96而不是72) 国家: getsizeof()调用对象的_sizeof__方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销 所以造成这种差异的唯一可能的原因是垃圾收集器对副本的处理方式不同,对吗?但为什么会这样呢 My environment:Win 10,Python 3.4.3
sys.getsizeof
()返回容器(列表)本身的大小,而不考虑内容,因此我得到它返回与[0]、[None]和[“0”]
相同的大小(72)
但是,为什么副本或深度副本需要更多内存来保存相同的数据(96而不是72)
国家:
getsizeof()调用对象的_sizeof__方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销
所以造成这种差异的唯一可能的原因是垃圾收集器对副本的处理方式不同,对吗?但为什么会这样呢
My environment:Win 10,Python 3.4.3 64位列表使用了一种调整大小的策略,该策略有时会在末尾保留空闲空间以容纳更多的元素,以保证摊销的固定时间附件。您的一些列表在末尾比其他列表有更多的空闲空间。Python不承诺任何列表都会有多少空闲空间。列表使用调整大小策略,有时会在末尾保留空闲空间以容纳更多元素,以保证摊销的固定时间附件。您的一些列表在末尾比其他列表有更多的空闲空间。Python没有承诺任何列表都会有多少空闲空间。我在3.6.6版本中得到了sizeof(c)72,我在3.6.6版本中得到了sizeof(c)72,所以这是一种实现细节,对吗?我知道要求非现场资源是离题的,但你能把提到这一点的任何来源联系起来吗?@MikeScotty:这在文章中有简要的提到。我不知道关于调整大小政策的任何其他官方文档。所以这是一种实现细节,对吗?我知道要求非现场资源是离题的,但你能把提到这一点的任何来源联系起来吗?@MikeScotty:这在文章中有简要的提到。我不知道调整大小政策的任何其他官方文件。
import sys, copy
x = [None]
y = x
c = copy.copy(x)
dc = copy.deepcopy(x)
print(x, y, c, dc) # [None] [None] [None] [None]
print(sys.getsizeof([0])) # 72
print(sys.getsizeof(["0"])) # 72
print(sys.getsizeof(x)) # 72
print(sys.getsizeof(y)) # 72
print(sys.getsizeof(c)) # 96
print(sys.getsizeof(dc)) # 96