【问题标题】:How to understand the memories of list structure take in Python?如何理解 Python 中列表结构的记忆?
【发布时间】:2021-10-10 05:05:32
【问题描述】:

我想知道蟒蛇的记忆。

这是代码:

import sys
list1 = [1]
list2 = [1,2]
list3 = [1,2,3]
list4 = [1,2,3,4]
list5 = [1,2,3,4,5]
list6 = ['1',2,3,4,5,6]
list7 = [1,2,'3','4',5,6,7]
list8 = [1,2,3,'sdsd',5,6,7,8]
list9 = [1,2,3,4,5,6,7,8,9]

print('list1 size is :', sys.getsizeof(list1))
print('list2 size is :', sys.getsizeof(list2))
print('list3 size is :', sys.getsizeof(list3))
print('list4 size is :', sys.getsizeof(list4))
print('list5 size is :', sys.getsizeof(list5))
print('list6 size is :', sys.getsizeof(list6))
print('list7 size is :', sys.getsizeof(list7))
print('list8 size is :', sys.getsizeof(list8))
print('list9 size is :', sys.getsizeof(list9))

这是结果:

list1 size is : 64
list2 size is : 72
list3 size is : 120
list4 size is : 120
list5 size is : 120
list6 size is : 152
list7 size is : 120
list8 size is : 120
list9 size is : 152

我困惑的问题是:

  • 为什么list6 大于list7 而等于list9?

  • 为什么是list3-list5equal tolist7-list8`?

谢谢大家。

【问题讨论】:

  • 当我运行这段代码时,我得到了list6 size is : 104,它们都按预期单调递增
  • 见stackoverflow.com/q/63204377/476,它回答了大部分问题。为什么 6 突然变大与预先分配列表的一些内部启发式方法有关。但是,详细讨论这一点有点没有实际意义,因为它甚至可能在 Python 版本和体系结构之间有所不同。如果您真的感兴趣,请查阅源代码。

标签: python list python-internals


【解决方案1】:

首先getsizeof 以字节为单位返回大小。

所以让我们把它分解成更小的步骤。

int、字符串+空列表的代码示例:

import sys

list1 = [1]
list2 = ['a']
list3 = []

print('list 1:', sys.getsizeof(list1))
print('list 2:', sys.getsizeof(list2))
print('list 3:', sys.getsizeof(list3))

回应

list 1: 64
list 2: 64
list 3: 56

如您所见,空列表使用 56 个字节,而带有字符串或 int 的列表使用相同数量的 64 个字节。

每个列表区域(步骤)将至少保留 8 个字节。要包含数据,请查看此示例。

import sys

list1 = [1]
list2 = [1,2]
list3 = [1,2,3]
list4 = [1134,2234,3334]
list5 = ['ab','t',3334]

print('list 1:', sys.getsizeof(list1))
print('list 2:', sys.getsizeof(list2))
print('list 3:', sys.getsizeof(list3))
print('list 4:', sys.getsizeof(list4))
print('list 5:', sys.getsizeof(list5))

列表 3-5 它使用了相同数量的空间,这里唯一的结果是列表项的数量。

list 1: 64
list 2: 72
list 3: 80
list 4: 80
list 5: 80

所以为什么你看到字节是相等的,我认为你关闭了 Python 的工作方式及其基本工作方式。

我无法解释它的更多信息,关于它的逻辑与否总是可以讨论的。

如果您将文本文档保存在计算机上,则相同,它会为文件保留一些空间,并且文件的实际字节大小通常不同,我认为 python 会做一些类似的事情。

【讨论】:

  • 要了解python如何重定位列表,可以查看list_resize()实现。搬迁前的一位cmets说:“增长模式是:0,4,8,16,24,32,40,52,64,76,...”.
猜你喜欢
  • 2015-05-13
  • 2016-10-14
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多