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

  • 实验结果

本机环境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.rhkb.cn/news/326370.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Llama3-Tutorial(Llama 3 超级课堂)-- 笔记

第1节—Llama 3 本地 Web Demo 部署 端口转发 vscode里面设置端口转发 https://a-aide-20240416-b4c2755-160476.intern-ai.org.cn/proxy/8501/ ssh -CNg -L 8501:127.0.0.1:8501 rootssh.intern-ai.org.cn -p 43681参考 https://github.com/SmartFlowAI/Llama3-Tutorial/b…

分享5个免费AI写作软件

在数字化时代,人工智能(AI)正以惊人的速度渗透到我们生活的方方面面,而写作领域也不例外。AI写作工具的出现,不仅改变了传统的写作流程,更在创意表达、文本生成、语言校正等方面展现了其独特的优势。这些工…

Pyhton专题学习资料包,Python从入门到精通全套学习资料[30G]

资源概览 百本Python学习书籍大礼包百本前端学习书籍大礼包微专业-数据挖掘分析之Python篇小甲鱼零基础入门学习Python(全96集) 资源获取 🧑‍💻【Pyhton专题资料】【30G】 百本Python书籍## 百本前端书籍 微专业-数据挖掘分析之Python篇 预备课【先…

安全测试|常见SQL注入攻击方式、影响及预防

SQL注入 什么是SQL注入? SQL注入是比较常见的网络攻击方式之一,主要攻击对象是数据库,针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,篡改数据库。 SQL注入简单来说就是通过在表单中填写包含SQL关键…

【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架——基本原理和步骤爬取当当网(基本步骤) 下载scrapy框架创建项目(项目文件夹不能使用数字开头,不能包含汉字)创建爬虫文件(1)第一步:先进入到spiders文件中&#x…

缓存菜品操作

一:问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 二:实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: 每个分…

Windows远程桌面实现之十四:实现AirPlay接收端,让苹果设备(iOS,iPad等)屏幕镜像到PC端

by fanxiushu 2024-05-04 转载或引用请注明原始作者。 这个课题已经持续了好几年,已经可以说是很长时间了。 实现的程序是 xdisp_virt, 可以去github下载使用:GitHub - fanxiushu/xdisp_virt: xfsredir file system 一开始是基于测试镜像驱动的目的随便开…

【数据库原理及应用】期末复习汇总高校期末真题试卷05

试卷 一、选择题 1.( )是存储在计算机内有结构的数据的集合。 A.数据库系统 B.数据库 C.数据库管理系统 D.数据结构 2.数据库的三级模式结构中,数据库对象—视图是( ) A.外模式 B.内模式 C.存储模式 D.模式 3.在下列关于关系表的陈述中,错误的是(…

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件,直接打开pom.xml文件,然后添加到maven就行

8种常见的CMD命令

1.怎么打开CMD窗口 步骤1:winr 步骤2:在弹出的窗口输入cmd,然后点击确认,就会出现一个cmd的窗口 2.CMD的8种常见命令 2.1盘符名称冒号 说明:切换盘的路径 打开CMD窗口这里默认的是C盘的Users的27823路径底下&#xf…

容器化Jenkins远程发布java应用(方式一:pipline+ssh)

1.创建pipline工程 2.准备工程Jenkinsfile文件(java目录) 1.文件脚本内容 env.fileName "planetflix-app.jar" env.configName "planetflix_prod" env.remoteDirectory "/data/project/java" env.sourceFile "/…

vue数据大屏并发请求

并发? 处理并发 因为js是单线程的,所以前端的并发指的是在极短时间内发送多个数据请求,比如说循环中发送 ajax , 轮询定时器中发送 ajax 请求. 然后还没有使用队列, 同时发送 的. 1. Promise.all 可以采用Promise.all处理并发, 当所有pro…

NX二次开发——测量距离(两个对象之间最近、最远距离)

一、概述 最近看到 一些文章比较有趣,所以做个记录,顺便写一下博客,附上全部代码,方便刚从事NX二次开发同僚的理解。本次主要模拟NX自带的测量工具中对两个实体对象进行测量距离。NX系统功能如下所示: 二、代码解析 主…

【MySQL】SQL基本知识点DML(2)

目录 1.DML添加数据 2.DML-修改数据 (1)改​编辑 (2)删​编辑​编辑 3.DQL-基本查询 (1)查询多个字段​编辑​编辑​编辑 (2)设置别名 (3)去重操作 4…

【设计模式】JAVA Design Patterns——Abstract-document

🔍 目的 使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。 🔍 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

百度地图API 快速入门

一、创建一个应用 创建成功可以在应用程序中查看到自己的ak密钥 二、基本使用 2.1 显示地图 在static下创建demo1.html &#xff08;将密钥换成自己的就可以显示地图了&#xff09; 示例&#xff1a; <!DOCTYPE html> <html> <head><meta name"…

[每周一更]-(第96期):Rsync 用法教程:高效同步文件与目录

文章目录 一、引言二、rsync 基本概念三、介绍rsync 是什么&#xff1f;四、安装五、rsync 基本语法常见示例&#xff08;默认ssh协议&#xff09;&#xff1a; 六、常用选项1. -a 或 --archive2. -v 或 --verbose3. -z 或 --compress4. --delete5. --exclude6. --exclude-from…

未来娱乐新地标?气膜球幕影院的多维体验—轻空间

在中国&#xff0c;一座独特的娱乐场所正在崭露头角&#xff1a;气膜球幕影院。这个融合了气膜建筑与激光投影技术的创新场所&#xff0c;不仅令人惊叹&#xff0c;更带来了前所未有的科幻娱乐体验。让我们一起探索这个未来的娱乐空间&#xff0c;感受其中的多维魅力。 现场演出…

Linux-- 重定向缓冲区

目录 0.接上篇文章 1.粗略的见一下这两个问题 2.理解重定向 3.理解缓冲区 0.接上篇文章 Linux--基础IO&#xff08;文件描述符fd&#xff09;-CSDN博客 1.粗略的见一下这两个问题 先来了解几个函数&#xff1a; stat()函数用于获取指定文件或符号链接的元数据。如果文件是…

巩固学习7

正则表达式 就是用来找到符合模式的字符串&#xff0c;这些模式包括&#xff1a;是什么字符&#xff0c;重复多少次&#xff0c;在什么位置&#xff0c;有哪些额外的约束 找某个字符串 import re text身高:178 体重:168 学号:123456 密码:9527 #在Python中&#xff0c;r前缀用…