【问题标题】:Why does the (deep) copy of a list consume more memory than the original list?为什么列表的(深)副本比原始列表消耗更多内存?
【发布时间】:2019-01-31 00:20:30
【问题描述】:
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

我知道sys.getsizeof (docs) 返回容器(列表)本身的大小,而不考虑内容,所以我知道它返回相同的大小(72) [0], [None] and ["0"].

但是,为什么副本或深副本需要更多内存来保存相同的数据(96 而不是 72)?

docs 状态:

getsizeof() 调用对象的 __sizeof__ 方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销。

因此,造成这种差异的唯一合理原因是垃圾收集器对副本的处理方式不同,对吧?但为什么会这样呢?

我的环境:Win 10,Python 3.4.3 64 位

【问题讨论】:

  • 我在 3.6.6 版本中得到 sizeof(c) 72

标签: python


【解决方案1】:

列表使用调整大小策略,有时会在末尾保留备用​​空间以容纳更多元素,以保证摊销的恒定时间追加。您的某些列表最后比其他列表有更多的空闲空间。 Python 不承诺任何列表会有多少空闲空间。

【讨论】:

  • 所以这是一种实现细节,对吧?我知道要求场外资源是题外话,但你能链接任何提到这一点的来源吗?
  • @MikeScotty:design faq 中简要提到过。我不知道调整大小政策的任何其他官方文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2012-09-09
  • 2018-02-01
  • 2010-09-17
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多