当前位置: 首页 > 面试题库 >

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

陶琦
2023-03-14
问题内容

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

import sys
sys.getsizeof(int)

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


问题答案:

简短的答案

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

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

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

每个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以指向该块中的下一个空闲整数对象。

我不完全确定一旦超过普通整数的存储容量,这种情况将如何变化,但是一旦这样做,an的大小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)。负数由具有负大小属性的对象表示!太奇怪了。



 类似资料:
  • 我知道byte不是一个合适的类型,不足以包含read方法的结果。 所以,read方法返回int类型值。 但我认为短类型比int更有效。 它可以包含范围-256~255的值。 为什么read方法返回int而不是short?

  • 本文向大家介绍Ajax中responseText返回的是一个页面而不是一个值,包括了Ajax中responseText返回的是一个页面而不是一个值的使用技巧和注意事项,需要的朋友参考一下 自己在struts2中的写好了业务逻辑用response返回的内容却是一个页面的! 然后就去了百度一下,说的是将struts2的返回值设为null(return null),这是因为struts2返回的是一个页面

  • 问题内容: 我在此链接中看到了一些代码,并感到困惑:http : //www.darkcoding.net/software/go-lang-after-four- months/ 第二个值(确定)是什么意思? 问题答案: 接收操作符返回的布尔变量指示接收的值是在通道上发送的(true)还是由于通道关闭且为空而返回的零值(false)。 当Go程序的其他部分关闭或通道时,循环终止。在这种情况下,其

  • 在给定以下约束的情况下,是否可以以某种方式编译: 您不能向添加任何其他修饰符。 不包含或,您不能更改它。 无法将重写器添加到编译器管道。 您可以更改周围的其他所有内容。

  • 伙计们,我正在写一个资源管理器,它可以管理不同类型的资源。资源可以是整数或一些自定义类型。所以,我定义了这样一个接口: 此接口的实现者之一管理“int”类型的资源。因为我做不到: 我最终做了: 注意:使用了“整数”而不是“整数”。 我有一段这样的代码: 函数internalToExternal()返回“int”而不是“Integer”。 问题:1.是否有从“int”到“Integer”的自动转换?

  • 问题内容: 今天,我了解并决定将其使用和测试。我知道整数是不可变的,因此id应该是(?)相同。但是,当我在提示中进行测试时,我注意到了一些细微的差异,并想找出其背后的原因。 凉!到目前为止,所有签出。但是之后… 好的,所以测试一下,我注意到此行为一直持续到256年。id最多可以是8位数字,然后257将返回更大的id,可以是15位数字。因此类型必须是8个字节。 所以我发现它与8个字节长有关,但是任何