为了账号安全,请及时绑定邮箱和手机立即绑定

“ sys.getsizeof(int)”返回一个不合理的大值?

/ 猿问

“ sys.getsizeof(int)”返回一个不合理的大值?

ITMISS 2019-11-14 15:23:11

我想检查python中int数据类型的大小:


import sys

sys.getsizeof(int)

结果是“ 436”,对我来说这没有意义。无论如何,我想知道我的机器将占用多少个字节(2,4,..?)int。


查看完整描述

3 回答

?
茅侃侃

简短的答案

您正在获得该类的大小,而不是该类实例的大小。调用int以获取实例的大小:


>>> sys.getsizeof(int())

24

如果该大小看起来仍然有些大,请记住Python int与intin(例如)c 有很大不同。在Python中,an int是成熟的对象。这意味着有额外的开销。


每个Python对象除了其他存储空间外,还至少包含一个refcount和对该对象类型的引用;在64位计算机上,占用16个字节!该int内部(由标准CPython的实现来确定)也随时间而变化,从而使采取额外的存储量取决于您的版本。


有关intPython 2和3中的对象的一些详细信息

这就是Python 2的情况。(其中一些摘自Laurent Luce的博客文章)。整数对象表示为具有以下结构的内存块:


typedef struct {

    PyObject_HEAD

    long ob_ival;

} PyIntObject;

PyObject_HEAD是一个宏,用于定义引用计数和对象类型的存储。文档对其进行了详细描述,并且可以在此答案中看到代码。


内存以大块分配,因此每个新整数都没有分配瓶颈。该块的结构如下所示:


struct _intblock {

    struct _intblock *next;

    PyIntObject objects[N_INTOBJECTS];

};

typedef struct _intblock PyIntBlock;

这些一开始都是空的。然后,每次创建一个新的整数时,Python都会使用指向的内存,next并递增next以指向该块中的下一个空闲整数对象。


我不完全确定一旦超过普通整数的存储容量,这种变化将如何变化,但是一旦您改变了,整数的大小int就会变大。在我的机器上,在Python 2中:


>>> sys.getsizeof(0)

24

>>> sys.getsizeof(1)

24

>>> sys.getsizeof(2 ** 62)

24

>>> sys.getsizeof(2 ** 63)

36

在Python 3中,我认为总体情况是相同的,但是整数的大小以更零散的方式增加:


>>> sys.getsizeof(0)

24

>>> sys.getsizeof(1)

28

>>> sys.getsizeof(2 ** 30 - 1)

28

>>> sys.getsizeof(2 ** 30)

32

>>> sys.getsizeof(2 ** 60 - 1)

32

>>> sys.getsizeof(2 ** 60)

36

当然,这些结果均取决于硬件!YMMV。


Python 3中整数大小的可变性表明它们的行为可能更像可变长度类型(例如列表)。确实,这是事实。这里的定义Çstruct用于int在Python 3对象:


struct _longobject {

    PyObject_VAR_HEAD

    digit ob_digit[1];

};

该定义随附的注释总结了Python 3的整数表示形式。零被存储的值不表示,但通过用零大小的对象(这就是为什么sys.getsizeof(0)是24字节,而sys.getsizeof(1)是28)。负数由具有负大小属性的对象表示!太奇怪了


查看完整回答
反对 回复 2019-11-14
?
慕的地6264312

这是12个字节-在我的情况下是24个字节。Python int与c中的int非常不同。在Python中,an int是成熟的对象。这意味着有额外的开销。请参阅此处,详细了解(cpython)int内部。

查看完整回答
反对 回复 2019-11-14
?
慕码人2483693

另外,这种描述的结构PyObject_HEAD,你的链接上面的页面中看到宏。除了其他存储空间外,每个Python对象还至少包含一个引用计数和对该对象类型的引用。 

查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信