栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

简短的答案

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

int
以获取实例的大小:

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

如果该大小看起来仍然有些大,请记住Python

int
int
in(例如)c有很大不同。在Python中,an
int
是成熟的对象。这意味着有额外的开销。

每个Python对象除了其他存储空间外,还至少包含一个refcount和对该对象类型的引用;在64位计算机上,占用16个字节!该

int
内部(由标准CPython的实现来确定)也随时间而变化,从而使采取额外的存储量取决于您的版本。

有关
int
Python 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
)。负数由具有负大小属性的对象表示!太奇怪了。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/661391.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号