Python中Flat序列为何比容器序列占用更多内存?

问题描述 投票:0回答:1

Fluent python 一书描述了两种类型的序列:Container 和 Flat,其中容器序列能够保存不同类型的项目,但作为对 Python 对象的引用,而像 str、byte 和 array.array 这样的平面序列 保存一个简单的项目类型,但值直接存储在序列存储器中。

它还指出内存中的每个 Python 对象都有一个包含元数据的标头。这 最简单的 Python 对象,一个浮点数,有一个值字段和两个元数据 在 64 位 Python 构建上,每个字段占用 8 个字节:

  • ob_refcnt:对象的引用计数
  • ob_type:指向对象类型的指针
  • ob_fval:保存浮点值的 C double

书上还说:

浮点数数组比浮点数元组紧凑得多

如果我没猜错的话,一个简单的浮点变量的大小应为 24 字节,包含 3 个浮点项的列表的大小应为 24 * 3 = 72 字节。

# Simple float variable
single_float: float = 3.14
single_float.__sizeof__() # -> 24

# A list with 3 float values
list_of_floats: list[float] = [1.12, 2.13, 3.14]
list_of_floats.__sizeof__() # -> 24 * 3 = 72

到目前为止,一切似乎都是正确的,除了当我尝试使用 array.array 重复相同的事情时,这是一个 Flat 序列,应该更紧凑,因为它的值不应该有元数据,我得到一个奇怪的结果,在其中数组的大小大于列表的大小,并且对于相同的值。

import array
array_of_floats = array.array("f", (1.12, 2.13, 3.14))
array_of_floats.__sizeof__() # -> 88 bytes, greater than the list of floats

# One single element
array_of_floats[0].__sizeof__() # -> 24 bytes, same as a float object

鉴于前面的示例,我想知道浮点数数组以何种方式比浮点数列表更紧凑,我可以理解它的内存效率更高且速度更快,因为值存储为静态值,但就大小而言,我不明白。

python arrays memory size sequence
1个回答
0
投票

那么我们就使用更多数据。

你会说 “我以为开车比走路快,为什么我开车去邻居家比走路要花更多的时间?”

array
和汽车都有一些固定的开销,这使得它们对于小型工作的效率较低。

© www.soinside.com 2019 - 2024. All rights reserved.