python - Python 基本类型的内存使用(尤其是 int 和 float)

标签 python memory-management python-internals

这是来自 Python 3.8.0 解释器的示例(但是,它在 3.7.5 中类似)

>>> import sys
>>> sys.getsizeof(int)
416
>>> sys.getsizeof(float)
416
>>> sys.getsizeof(list)
416
>>> sys.getsizeof(tuple)
416
>>> sys.getsizeof(dict)
416
>>> sys.getsizeof(bool)
416
getsizeof()返回 Python 对象消耗的字节数以及垃圾收集器的开销(参见 here)。基本python类消耗相同数量的内存的原因是什么?

如果我们看一下这些类的实例

>>> import sys
>>> sys.getsizeof(int())
24
>>> sys.getsizeof(float())
24

默认参数是 0并且这两个实例对此参数的内存使用量相同。但是,如果我尝试添加一个参数

>>> sys.getsizeof(int(1))
28
>>> sys.getsizeof(float(1))
24

这就是奇怪的地方。为什么 int 类型的实例内存使用量增加,而 float 类型的实例内存使用量没有增加?

最佳答案

简而言之,这一切都归结为 Python 如何表示任意长整数。 float()类型表示(受限)就像 C double .

在 CPython 实现中,每个对象( source )都以引用计数和指向该对象的类型对象的指针开始。那是 16 个字节。

float 对象将其数据存储为 C double ( source ),即 8 个字节。所以 16 + 8 = 24 字节 用于 float 对象。

整数 ,情况比较复杂。整数对象表示为可变大小的对象 (source),对于 16 个字节,它又增加了 8 个字节。
数字表示为数组。根据平台的不同,Python 使用具有 30 位数字的 32 位无符号整数数组或具有 15 位数字的 16 位无符号整数数组。所以对于小整数,数组中只有一个 32 位整数,所以再添加 4 个字节 = 16 + 8 + 4 = 28 字节 .

如果要表示更大的整数,则大小会增加:

sys.getsizeof(int(2**32))  # prints 32 (24 + 2*4 bytes)
sys.getsizeof(int(2**64))  # prints 36 (24 + 3*4 bytes)

编辑:

sys.getsizeof(int)你得到的是类的大小,而不是类的实例。 float 也是如此, bool , ...
print(type(int))  # prints <class 'type'>

如果您查看 source ,引擎盖下有很多东西。在我的 Python 3.6.9 (Linux/64bit) 版本中,这会打印 400 个字节。

关于python - Python 基本类型的内存使用(尤其是 int 和 float),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59342632/

相关文章:

c++ - malloc/new 是否从缓存或 RAM 返回内存块?

python - list() 与 Python 3.5+ 中的可迭代拆包

python - None 在代码对象的 co_consts 属性中做了什么?

python - 为什么 `mylist[:] = reversed(mylist)` 有效?

python - 附加了奇怪的 csv 标题

c - 如果同一个共享库工作正常,为什么静态库会导致对齐问题?

python - 用系列更新数据框

php - 在 PHP 中运行密集的批处理,并避免内存耗尽

python - numpy 中的快速标量三重积

python - 无法将打印语句放入生成器中