从Python整数变量内存大小占用28字节谈起

news2025/1/16 20:59:53
  • 实验结果

本机环境64位Python 3.12

  • 内存布局图

0          4          8         12         16         20         24         28

 |----------|----------|----------|----------|----------|----------|----------|

 | ob_refcnt | ob_type    | ob_digit            |             pad               |

 |----------|----------|----------|----------|----------|----------|----------|

在这个布局图中,各个部分的含义如下:

  1. 1) ob_refcnt:4 字节,用于存储对象的引用计数。
  2. 2) ob_type:4 字节,指向对象的类型信息。
  3. 3) ob_digit :8字节,存储整数值。
  4. 4) pad: 12字节,用于填充和对齐,保证整个结构体大小为 28 字节。

在这个布局中,整数值被存储在 ob_digit 中,而引用计数和类型信息分别存储在 ob_refcnt  ob_type 中。填充字节用于对齐和填充,保证整个结构体的大小为 28 字节。这种布局使得整数对象在 Python 3.7 版本之后能够更加高效地存储整数值,并且减少了内存占用

  • 数据结构

Python 中,整数类型的结构体在 CPython 中被定义为 _PyLongObject,其中存储了整数对象的相关信息。以下是整数类型结构体 _PyLongObject 的简化版本:

typedef struct {

    PyObject_VAR_HEAD

    // other fields specific to long integers

    digit ob_digit[1];

} PyLongObject;

在这个结构体中,PyObject_VAR_HEAD 包含了对象的引用计数和类型信息,ob_digit 是一个数组,用于存储整数值。实际上,ob_digit 是一个灵活数组,其大小可以根据需要进行调整,以便存储长整型数据。

Python 3.7 版本之后,整数对象的内存布局调整,PyLongObject 结构体中的 ob_digit 数组用于存储整数值,而不再需要额外的字段来存储整数值。这样的设计使得整数对象的内存占用更加高效,同时也提高了整数对象的操作效率。

  • 再往下一层

PyObject_VAR_HEAD 是 Python 中用于定义可变大小对象的结构体宏。在 CPython 中,所有可变大小的对象(如列表、元组、字符串等)都以相同的结构开始,其中包含对象的引用计数和类型信息。

Python 3.7 中,PyObject_VAR_HEAD 的定义如下:

#define PyObject_VAR_HEAD                   \

    PyObject_HEAD                          \

Py_ssize_t ob_size;  /* Number of items in variable part */

其中:

  • PyObject_HEAD 包含了对象的引用计数和类型信息,通常定义为

#define PyObject_HEAD    \

    _PyObject_HEAD_EXTRA \

    Py_ssize_t ob_refcnt; \

struct _typeobject *ob_type;

  • ob_size 表示可变部分中的项目数量,例如,对于列表对象,ob_size 表示列表中元素的个数。

因此,PyObject_VAR_HEAD 宏实际上是将 PyObject_HEAD 中的引用计数和类型信息与 ob_size 合并在一起,用于定义可变大小对象的结构体。这样的设计使得 Python 能够灵活地处理可变大小对象,同时保持了一致的对象表示方式。

PyObject  Python 中所有对象的基本结构体,定义了所有 Python 对象共享的通用属性。在 CPython 中,PyObject 结构体的定义如下:

typedef struct _object {

    _PyObject_HEAD_EXTRA

    Py_ssize_t ob_refcnt;

    struct _typeobject *ob_type;

} PyObject;

其中:

  • _PyObject_HEAD_EXTRA 包含了一些额外的信息,通常用于调试和特定配置的目的。
  • ob_refcnt 表示对象的引用计数,用于跟踪对象的引用情况,当引用计数为 0 时,对象会被销毁。
  • ob_type 指向对象的类型对象,用于标识对象的类型信息,如整数、字符串、列表等。

PyObject 结构体是所有 Python 对象的基础,所有的 Python 对象都是以 PyObject 结构体为基础进行扩展的。通过这种方式,Python 实现了对象的通用性和灵活性,使得不同类型的对象可以共享相同的基本属性和行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++初识多态(1)

1.多态要解决的问题(引入) 任何一种机制的存在,必然是有其存在的意义的,例如我们前面学过的函数重载,运算符重载,以及引用等等,都是解决一些特殊问题的; 下面通过一些具体的例子&a…

Postman的一些使用技巧

Postman 是一个流行的 API 开发工具,用于设计、开发、测试、发布和监控 API。在现代web开发中使用非常广泛。后端开发必备而且必会的工具。 目录 1.配置环境变量 2.动态变量 3.脚本 4.测试 5.模拟 6.监控 7.集合运行器 8.响应保存 9.请求历史 10.同步请求…

6、随机森林(Random forests)

Random forests started a revolution in machine learning 20 years ago. For the first time, there was a fast and reliable algorithm which made almost no assumptions about the form of the data, and required almost no preprocessing. In today’s lesson, you’ll…

数据结构——实现通讯录(附源码)

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…

党建教育vr虚拟现实展厅真正实现了绿色、低碳的展示方式

在数字化浪潮席卷的今天,传统企业门户官网已难以满足企业日益增长的展示需求。面对这一挑战,北京华锐凭借深厚的行业经验和领先的技术实力,为您提供全新的元宇宙虚拟展厅制作服务,助您轻松打破现实与虚拟的界限,开启企…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝(Tip Toasts)

Flutter笔记 Widgets Easier组件库(11)使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

【文献解析】NeRF的原理是什么

论文:https://arxiv.org/abs/2003.08934 TensorFlow代码:https://github.com/bmild/nerfPyToch代码:https://github.com/yenchenlin/nerf-pytorch 一、文章概述 1.问题导向 从新视点生成照片级真实感输出需要正确处理复杂的几何体和材质反…

WEB基础--JDBC操作数据库

使用JDBC操作数据库 使用JDBC查询数据 五部曲:建立驱动,建立连接,获取SQL语句,执行SQL语句,释放资源 建立驱动 //1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver"); 建立连接 //2.连接数据库 Stri…

提高谷歌抓取成功率:代理IP的7个使用误区

在当今数字化时代,数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据,特别是Google,使用代理IP是常见的手段。然而,使用代理抓取Google并不是一件轻松的事情,有许多常见的误区可能会导…

Ubuntu 部署agular项目

我的front-end是用的webpack,就直接执行的npm run build打包。 完成之后就可以\target\classes\static找到 ,直接把整个static上传到需要部署的地方就可以了。 当然这个打包output路径也是angular.json配置好了的 sudo apt update sudo apt install n…

大模型微调之 在亚马逊AWS上实战LlaMA案例(三)

大模型微调之 在亚马逊AWS上实战LlaMA案例(三) 使用 QLoRA 增强语言模型:Amazon SageMaker 上 LLaMA 2 的高效微调 语言模型在自然语言处理任务中发挥着关键作用,但训练和微调大型模型可能会占用大量内存且耗时。在本文中&…

华为数据之道第二部分导读

目录 导读 第二部分 第4章 面向“业务交易”的信息架构建设 信息架构的四个组件 数据资产目录 数据标准 数据模型 数据分布 信息架构原则:建立企业层面的共同行为准则 信息架构建设核心要素:基于业务对象进行设计和落地 按业务对象进行架构设…

十分钟掌握Java集合之List接口

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地,而且建议有多份副本 备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方 冗余: 数据有多份冗余,但不等备份&…

GNU Radio FFT模块窗函数对比

文章目录 前言一、grc 图二、窗函数及对应的运行结果1、矩形窗2、汉明窗3、汉宁窗4、黑曼窗5、黑曼-哈里斯窗6、凯泽窗7、巴特利特窗8、平顶窗 前言 GNU Radio 中 FFT 模块的窗函数包括以下几种:矩形窗(Rectangular Window)、汉明窗&#xf…

分割模型Maskformer系列

maskformer:Per-Pixel Classification is Not All You Need for Semantic Segmentation 论文地址:https://arxiv.org/pdf/2107.06278 1.概述 传统的语义分割方法通常采用逐像素分类(per-pixel classification),而实…

邦注科技 模具保护器 CCD电子眼 专业工业视觉检测设备

模具保护器是一种用于保护模具的设备,可以在塑料压铸和冲床等加工过程中起到保护模具的作用。以下是关于模具保护器在保护塑料压铸和冲床模具方面的应用: 塑料压铸模具保护器: 防止碰撞:在塑料压铸过程中,模具可能会…

【CSS基础--CSS选择器的常见用法】

CSS选择器的常见用法 1.CSS介绍1.1 基本语法规范1.2 引入样式1.3 规范 2. CSS选择器2.1 标签选择器2.2 类选择器2.3 ID选择器2.4 复合选择器 1.CSS介绍 CSS(Cascading Style Sheet),层叠样式表,由于控制页面的样式。CSS能够对网页…

【已解决】‘pip‘ 不是内部或外部命令问题

😎 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun,视频号:AI-行者Sun 🎈 本文专栏:本文收录于《AI实战中的各种bug…

Linux网站服务

1.概念:HTML:超级文本编辑语言 网页:使用HTML,PHP,JAVA语言格式书写的文件。 主页:网页中呈现用户的第一个界面。 网站:多个网页组合而成的一台网站服务器。 URL:统一资源定位符,访问网站的地址。 网站架构:LAMP: LinuxApacheMYSQLPHP(系统服务器程序数据管理…