Python源码剖析笔记1-整数对象PyIntObject

news2024/9/22 8:34:47

1、PyIntObject 对象

[intobject.h]
typedef struct {
	PyObject_HEAD
    long ob_ival;
} PyIntObject

PyIntObject是一个不可变(immutable)对象。Python内部也大量的使用整数对象,我们在自己的代码中也会有大量的创建销毁整型对象的操作,因此单独的维护整形对象并对其申请内存和释放内存是不现实的。Python给出的解决方案是将整形对象通过一定的结构连接在一起的整数对象系统:整数对象池,一个整形对象的缓冲池机制。

对象创建:

  • PyInt_FromString
  • PyInt_FromLong
  • PyInt_FromUnicode

其中,后两种方法实际上是先转换成浮点数,然后再调用PyInt_FromFloat,这实际上是 Adaptor Pattern 的思想:对核心函数进行接口转换。

2、小整数对象

小整数会频繁的使用。在 Python 中,所有的对象都是存活在系统堆上。这样的操作不仅大大降低了运行效率,而且会在系统堆上造成内存碎片。

所以解决方法就是对小整数使用对象池技术,正是因为使用缓冲池,PyIntObject才是不可变对象。对象池中的每一个对象可以被安全的共享。那么,多小才算小整数?默认的范围是-5到256,这个值不可以动态修改,要想修改只能修改源代码然后重新编译。

3、大整数对象

对于大整数对象,是一次申请一块内存,这块内存用PyIntBlock结构体管理,该结构体中中有一个PyIntObject数组(会链表形式维护)来供大整数对象使用,还有一个用于形成链表的指向下一个block的指针。如果这一整块内存都祸祸光了(默认一个block可以存放82个int对象),就再申请一个PyIntBlock,然后用一个单向链表维护所有的PyIntBlock,这个链表就是大整数对象缓冲池两个重要变量其中之一:block_list指针。

这个 block 链表维护的是一整块block,是block级别的,我要使用的是PyIntObject,每次使用的话总不能进到block去遍历数组去找到一个还没使用的PyIntObject吧,所以下一个大整数缓冲池至关重要的变量就是free_list指针,这个指向一个链表,链表中的所有元素是PyIntObject。

4、引用计数:ob_refcnt

Python通过管理对象的引用计数来决定对象在内存中的存在与否,Python一切皆对象,所有对象都有一个 ob_refcnt 变量。这个变量维护这对象的引用计数,也决定这对象的存在与消亡。

对于某一对象A,当有一个新的PyObject * 引用该对象时,A的引用计数应该增加,而当PyObject * 被删除时, 引用计数应该减少。计数为0时,A 可以从堆上被删除,释放内存。

5、运行时整数对象及其类型之间的关系

对于int(10) 的 ob_refcnt 来说可以理解为多个ref 引用了这个对象,ob_type 是指向其类型对象的指针,ob_ival 是具体数值。

int(10) 是PyIntObject 的实例对象,比PyObject 多一个ob_ival 成员,PyInt_Type、PyBaseObject_Type、PyType_Type 都是PyTypeObject 的实例对象。PyInt_Type 的 tp_base 指向其基类对象 PyBaseObject_Type,而他们的 ob_type 都指向 PyType_Type。

6、不同PyintBlock中空闲内存的互连:tp_dealloc

Python中不同对象在销毁时会进行不同的动作,销毁动作在与对象对应的类对象中被定义,这个关键操作就是类型对象中的tp_dealloc。

static void int_dealloc(PyIntObject *v)
(
    if (PyInt_CheckExact(v))  {
        v->ob_type = (struct _typeobject *)free_list;
        free_list = v;
    }
    else
        v->obtype->tp_free((Pyobject *)v);

tp_dealloc的作用:

由block_list维护的PyIntBlock链表中的内存实际是所有的大整数对象共同分享的。当一个PyIntObject对象被销毁时,它所占的内存并不会被释放,归还给系统,Python会继续保留着。将来提供给别的PyIntObject使用,所以Python应该将其链入了free_list所维护的自由内存链表。

以下是创建可删除PyIntObject对象2、3、4的过程中,内存中对象PyIntObject以及free_list指针的变化:

不同PyIntBlock对象中空闲内存的互连是在int_dealloc被调用时实现的。

 注意:在int_dealloc中,永远不会向系统堆交还任何内存,一旦系统堆中的某块内存被python申请用于整数对象,那么这块内存在Python进程结束之前,将永远不会得到释放。

由于内存共享,Python用于实现该对象池的内存与历史上创建的整数对象的个数无关,而仅仅与同一时刻共存的整数对象个数的最大值有关

————————————————

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

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

相关文章

SVM 用于将数据分类为两分类或多分类(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

CMake中install的使用

CMake中的install命令用于指定安装时要运行的规则&#xff0c;其格式如下&#xff1a; install(TARGETS targets... [EXPORT <export-name>][RUNTIME_DEPENDENCIES args...|RUNTIME_DEPENDENCY_SET <set-name>][[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDL…

基于单片机的电压电流表设计

原理图&#xff1a; 部分程序&#xff1a; #include "stc15.h" #include "delay.h" #include "timer.h" #include "TM7707.h" #include "LCD1602.h" #include "eeprom.h" #include "stdio.h" #include…

【数学】双根号求值域问题

∣双根号求值域问题NightguardSeries.∣\begin{vmatrix}\Huge{\textsf{ 双根号求值域问题 }}\\\texttt{ Nightguard Series. }\end{vmatrix}∣∣∣∣∣​ 双根号求值域问题 Nightguard Series. ​∣∣∣∣∣​ 求 f(x)3x−63−xf(x)\sqrt{3x-6}\sqrt{3-x}f(x)3x−6​3−x​ 的…

开发工具——gdb

开发工具gdb gdb在Linux下负责程序的调试。 gdb相较于vs2019的调试&#xff0c;是不方便的。图形化界面调试确实是一种进步的现象。 先编写一个简单的程序&#xff0c;如果不支持在for循环中定义变量&#xff0c;要在编译指令后面加上-stdc99选项。 要编译的文件和要生成的文…

Spring 源码编译

Spring 源码编译&#xff0c;一定要选好版本&#xff01;&#xff01;&#xff01; Spring 源码编译&#xff0c;一定要选好版本&#xff01;&#xff01;&#xff01; Spring 源码编译&#xff0c;一定要选好版本&#xff01;&#xff01;&#xff01; 重要的事说三遍。 Spri…

MYSQL用函数请三思

背景&#xff1a;最近公司有个同事遇到个需求需要用到mysql sleep函数&#xff0c;但结果却大出意料. 测试如下&#xff1a; 表&#xff1a; CREATE TABLE test_sleep ( id int NOT NULL AUTO_INCREMENT, a int NOT NULL, b int NOT NULL, PRIMARY KEY (id), KEY a (a) ) ENGIN…

电子学会2021年3月青少年软件编程(图形化)等级考试试卷(一级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 花花幼儿园有三个班。根据下面三句话&…

CentosLinux 7 字符安装教程

打开VMware虚拟机,点击文件 — 新建虚拟机选项。在弹出的对话框中选择自定义(高级)选项。单机下一步。 以下步骤根据自己的所需自行配置

[附源码]Python计算机毕业设计Django酒店在线预约咨询小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

健身中心管理系统/健身房管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

【OpenCV-Python】教程:3-16 利用Grabcut交互式前景提取

OpenCV Python Grabcut分割 【目标】 Grabcut 算法创建一个交互程序 【理论】 从用户角度是如何工作的呢&#xff1f;用户在需要的目标上初始绘制一个矩形&#xff0c;前景目标必须完全在矩形内部&#xff0c;算法迭代的去分割然后得到更好的效果&#xff0c;但是有些情况下…

Java9-17新特性解读,了解少于3个你可能脱节了

前言 Java8出来这么多年后&#xff0c;已经成为企业最成熟稳定的版本&#xff0c;相信绝大部分公司用的还是这个版本&#xff0c;但是一眨眼今年Java19都出来了&#xff0c;相信很多Java工程师忙于学习工作对新特性没什么了解&#xff0c;有的话也仅限于某一块。 本篇就是博主对…

【论文笔记】Radatron: Accurate Detection Using Multi-Resolution Cascaded MIMO Radar

文章及补充材料链接&#xff1a;https://jguan.page/Radatron/ 理解本文需要一些电磁波与雷达信号处理相关的理论知识。 1. 引言 雷达的角度分辨率通常很低。雷达的角度分辨率与雷达的天线孔径成反比&#xff0c;因此毫米波雷达要达到激光雷达的角度分辨率&#xff0c;需要3000…

黑盒测试用例设计 - 因果图法

说明 因果图法是一种适合于描述对多种输入条件组合的测试方法根据输入条件的组合、约束关系和输出条件的因果关系&#xff0c;分析输入条件的各种组合情况&#xff0c;从而设计测试用例的方法它适合于检查程序输入条件涉及的各种组合情况 使用步骤 第一步&#xff1a;根据功…

60岁首席工程师被SpaceX边缘化,主管:我怕他退休或死了

金磊 发自 凹非寺量子位 | 公众号 QbitAI在SpaceX&#xff0c;连首席工程师竟也能遭遇职场边缘化。故事的主人公叫做John Johnson&#xff08;姑且叫他“逊哥”&#xff09;&#xff0c;他在2018年加入SpaceX。当时的逊哥已经58岁&#xff0c;但在光学工程领域可谓颇有建树。刚…

Java---数据库---MyBatisPlus

MyBatisPlus1&#xff0c;MyBatisPlus入门案例与简介1.1 入门案例步骤1:创建数据库及表步骤2:创建SpringBoot工程步骤3:勾选配置使用技术步骤4:pom.xml补全依赖步骤5:添加MP的相关配置信息步骤6:根据数据库表创建实体类步骤7:创建Dao接口步骤8:编写引导类步骤9:编写测试类1.2 M…

Java项目:ssm图书馆管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 功能介绍 基于ssm的图书馆管理系统.主要功能包括&#xff1a;图书查询、图书管理、图书编辑、读者管理、图书的借阅与归还以及借还日志记录等。 用户分为…

ArrayList源码阅读笔记

1. 基础知识 1.1 概念 ArrayList是可以动态增长和缩减的索引序列&#xff0c;它是基于数组实现的List类。该类封装了一个动态再分配的Object[]数组&#xff0c;每个对象都有一个capacity属性&#xff0c;表示它们所封装的Object[]数组长度&#xff0c;当向ArrayList中添加元素…

DAMOYOLO windows 单卡训练

最近达摩院放出了目前最能打的yolo算法&#xff0c;时间和精度都得到了提升 目前代码已经开源&#xff1a; 代码地址&#xff1a;GitHub - tinyvision/DAMO-YOLO: DAMO-YOLO: a fast and accurate object detection method with some new techs, including NAS backbones, effi…