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

为什么int在Python中需要三倍的内存?

凤经武
2023-03-14
问题内容

在64位系统上,Python中的整数占用24个字节。这是C语言中64位整数所需内存的3倍。现在,我知道这是因为Python整数是对象。但是,额外的内存又有什么用呢?我有我的猜测,但肯定会很高兴。


问题答案:

请记住,Pythonint类型没有C那样有限的范围int。唯一的限制是可用内存。

内存用于存储值,整数存储的当前大小(存储大小可变以支持任意大小)以及标准的Python对象簿记(对相关对象的引用和引用计数)。

您可以查找longintrepr.h源代码(Python
3类型在Python
2中int传统上称为long类型)。它有效地利用了PyVarObjectC类型来跟踪整数大小:

struct _longobject {
        PyObject_VAR_HEAD
        digit ob_digit[1];
};

ob_digit数组存储“数字”宽15个或30比特的(取决于你的平台上); 因此在我的64位OS X系统上,最大(2 ^
30)-1的整数使用1个“数字”:

>>> sys.getsizeof((1 << 30) - 1)
28

但是如果您在数字中使用2个30位数字,则需要额外的4个字节,依此类推:

>>> sys.getsizeof(1 << 30)
32
>>> sys.getsizeof(1 << 60)
36
>>> sys.getsizeof(1 << 90)
40

然后,基数为24的字节是PyObject_VAR_HEAD结构,其中包含对象大小,引用计数和类型指针(在我的64位OS X平台上为每个8字节/
64位)。

在Python 2上,整数<=sys.maxint但> =-sys.maxint - 1使用仅存储单个值的简单结构存储:

typedef struct {
    PyObject_HEAD
    long ob_ival;
} PyIntObject;

因为它使用PyObject而不是结构中PyVarObject没有ob_size字段,并且内存大小限制为仅24个字节;8表示long值,8表示引用计数,8表示类型对象指针。



 类似资料:
  • 问题内容: 我从节点启动这是来自node.js README.md 先决条件(仅Unix): 想知道为什么node.js需要Python?它是否在其API下使用Python 问题答案: Node.js使用GYP构建-GYP —用Python编写的跨平台构建工具。Python中还实现了其他一些构建步骤。因此,从源代码构建节点需要Python。 但是您还需要Python来构建本机插件。

  • 在制作一个方法将一个新创建的表单放置在我屏幕上的一个完全随机的位置上而不超出所述屏幕的界限时,我有一个有趣的代码契约消息,声明...

  • 问题内容: 我不知道为什么我们需要在报表。我认为,此代码块 使用以下命令与此相同: 我想念什么吗? 问题答案: 如果您提早返回,将会有所不同: 比较一下: 可能导致差异的其他情况: 如果在except块内引发异常。 如果引发异常,但不是。 其他控制流语句,例如和语句。

  • 我发现了一个很受欢迎的问题的答案,下面的代码是: 为什么...是必需的?如果我省略了,巴别就会对我抱怨说: 它看起来像扩展语法,但是一个布尔值。我找不到能解释到底发生了什么的医生。

  • 问题内容: 我真的不明白为什么在核心类型链接中会在属性描述中说(例如,对于一个数字): store-设置为yes,将实际字段存储在索引中,否,则不存储它。默认为no(请注意, JSON文档本身已存储,可以从中检索 ) index-如果不应为该值建立索引,则设置为no。在这种情况下,应该将store设置为yes,因为如果未对它进行索引和存储, 则与它无关 这两个大胆的部分似乎矛盾。如果我仍然可以从源

  • 问题内容: 特别是在Python中,如何在线程之间共享变量? 尽管我以前从未使用过,但从未真正理解或看到过如何共享变量的示例。它们是在主线程和子线程之间共享还是仅在子线程之间共享?我何时需要使用线程本地存储来避免这种共享? 我已经看到许多有关通过使用锁在线程之间同步对共享数据的访问的警告,但是我还没有看到这个问题的一个很好的例子。 提前致谢! 问题答案: 在Python中,所有内容都是共享的,但函