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

了解Python中大整数的内存分配

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

了解Python中大整数的内存分配

为什么

28
字节的初始值低至
1

我相信@bgusach完全回答了这一点;Python使用

C
结构来表示Python世界中的对象,包括
int
s的任何对象:

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

PyObject_VAR_HEAD
是一个宏,在展开时会在结构中添加另一个字段(该字段
PyVarObject
专门用于具有某种长度概念的对象),并且
ob_digits
是一个保存数字值的数组。锅炉板大小来自于结构,为小型
大型Python号码。

为什么增加

4
字节?

因为,当创建更大的数字时,大小(以字节为单位)是

sizeof(digit)
;的倍数。您可以看到,在
_PyLong_New
其中使用以下命令
longobject
执行新的内存分配
PyObject_MALLOC

if (size > (Py_ssize_t)MAX_LONG_DIGITS) {    PyErr_SetString(PyExc_OverflowError,         "too many digits in integer");    return NULL;}result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) +   size*sizeof(digit));

offsetof(PyLongObject, ob_digit)
是与保持其值无关的长对象的“模板”(以字节为单位)。

digit
在头文件保持被定义
struct _longobject
typedef
uint32

typedef uint32_t digit;

并且

sizeof(uint32_t)
4
字节。这是当
size
参数to
_PyLong_New
增大时您将看到的大小(以字节为单位)增加的数量。


当然,这就是

C
Python选择实现它的方式。这是一个实现细节,因此您不会在PEP中找到太多信息。如果您可以找到相应的线程:-),则python-
dev邮件列表将包含实现讨论。

无论哪种方式,您都可能在其他流行的实现中发现不同的行为,因此请不要认为这是理所当然的。



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

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

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