[python 源码]整数对象的创建和维护

刚开始学python时候,发现一个很迷惑的现象,一直到看了源码后才知道了:

>>> a=6
>>> b=6
>>> a is b
True

想用同样的参数初始化两个对象,结果却是,这两个对象其实是同样的对象????逗我呢?

>>> a=666
>>> b=666
>>> a is b
False

这又是怎么回事?为什么现在又是False了???

这些不同,主要来自于python中对待小整数和大整数的初始化方式不同,而且他们都是在对象池中的,只不过所在的对象池不同。。。

那么,什么是小整数,什么又是大整数?在python中默认-5~256为小整数,其余的为大整数。。。

>>> a=256
>>> b=256
>>> a is b
True
>>> a=257
>>> b=257
>>> a is b
False

那么问题又来了,为什么要区分小整数和大整数?

因为如果不停的调用malloc和free,会严重的影响python的性能,为了减少malloc和free的次数,python会预先初始化所有小整数的对象,也就是说,在我们用小整数对象的时候,没有创建,没有初始化,而是得到了一个本来就在内存中的小整数对象的引用

如果小整数太多的话,会占用太多的内存,也会影响性能的,所以Guido大叔就默认了-5~256为小整数。

那么,大整数是怎么初始化的?

为了减少创建大整数对象时候减少malloc和free的次数,当用到大整数时候,python会一次malloc几十个大整数对象的链表,称为一个block,然后用一个block_list指针指向已经占用的所有对象的链表,当这个block用完的时候,再malloc从下一个block。

那么,问题又来了,比如,如果第二个block中的内存还没用完,第一个block中已经有对象不用了怎么办?岂不是就浪费了

在python中,会有一个free_list的指针指向所有可用的对象内存,当某个对象不用的时候,就添加到free_list链表中,同时从block_list中移除。

发现了什么,竟然只有malloc,没有free,没有内存交换系统。

python中应该还有另外一个机制防止内存泄露。。。这个现在就还不明白怎么做到的了

参考资料:python源码剖析

时间: 2025-01-13 06:36:34

[python 源码]整数对象的创建和维护的相关文章

Python源码--整数对象(PyIntObject)的内存池

[背景] 原文链接:http://blog.csdn.net/ordeder/article/details/25343633 Python整数对象是不可变对象,什么意思呢?例如执行如下python语句 >>>a = 1023 >>>a = 1024 >>>b = a >>>c = 1024 >>>d = 195 >>>e = 195 python的整数对象结构为: typedef struct {

[python 源码]字符串对象的实现

还是带着问题上路吧,和整数对象的实现同样的问题: >>> a='abc' >>> b='abc' >>> a is b True >>> c='abc'*10 >>> d='abc'*10 >>> d is c False why?在整数对象的实现中,对待小整数有小整数对象池,对待大整数对申请内存,字符串对象的实验也是这样的吗??? NO 先看下字符串对象的定义: typedef struct{ P

python源码分析----对象结构

虽然自己会吐槽python这语言让人受不了的慢,不过也不得不说python语言在语法上的精炼,在写代码的时候确实会比java方便一些...不过由于python无法像java一样项目的开始先定义一套强类型限制的接口,所以总感觉在写python的时候有点不踏实...不过pycharm从某种程度上通过注释也能减轻一点这方面的担忧.. 好了.....决定了要看一下python的实现...这里就先从python的对象结构来说吧.... 在python中,所有的东西都是对象,整数是,方法也是,..总之什么都

JQuery源码解析-- 对象的创建

使用 $("a") 返回的对象就不再是一个简单的DOM对象了,而是一个复杂的JQuery对象. 那么JQuery是怎么创建对象的. 为了便于分析,我将JQuery中复杂的代码简化了一番,便于分析. (function(global,factory){ factory(global); })(this,function(window,noGlobal){ var myJQuery=function(selector,context){ return new myJQuery.fn.ini

《python源码剖析》笔记 python中的整数对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1. PyIntObject --> long的一个简单包装 typedef struct{ PyObject_HEAD long ob_ival; } PyIntObject; PyInt_Type --> PyIntObject的类型对象.与对象相关的元信息实际上都是保存在与对象对应的类型对象中的 PyTypeObject PyInt_Type = { PyObject_HEAD_I

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

Python源码剖析笔记2-Python整数对象 本文简书地址: http://www.jianshu.com/p/0136ed90cd46 千里之行始于足下,从简单的类别开始分析,由浅入深也不至于自己丧失信心.先来看看Python整数对象,也就是python中的PyIntObject对象,对应的类型对象是PyInt_Type. 1 Python整数对象概览 为了性能考虑,python中对小整数有专门的缓存池,这样就不需要每次使用小整数对象时去用malloc分配内存以及free释放内存.pyth

[python]源码-对象的创建和行为

(明天论文就要送审了!!!距离毕业一个月!!!) 现在还记得刚开始学python时候被这种动态语言惊到的那种感觉,列表和字典对象可以随意伸缩,简直不能更帅了,但是一直不知道内部到底是怎么实现的,python源码用C实现的,但是C是过程性语言啊. 说怎么实现之前,先捋捋什么是对象,对这个我觉得<python源码剖析>这本书里面的解释很有意思:"一个对象实际上就是一片被分配的内存空间,这些内存可能是连续的,也可能是不连续的,这都不重要,重要的是这片内存在更高的层次上可以作为一个整体来考虑

《python源码剖析》笔记 python对象初探

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.      在python中,对象就是为C中的结构体在堆上申请的一块内存.对象不能被静态初始化,也不能在栈空间生存.但内建的类型对象都是被静态初始化的. 2.      对象创建后大小不变.可变对象有一指针指向可变大小的内存区域. 3.      对象机制的基石:PyObject 定长对象: typedef struct _object{ PyObject_HEAD }PyObject

《python源码剖析》笔记 python中的List对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyListObject对象 --> 变长可变对象,可看作vector<PyObject *> typedef struct{ PyObject_VAR_HEAD //其中的ob_size表示实际被使用的内存的数量 PyObject **ob_item;//ob_item为指向元素列表的指针,实际上,Python中的list[0]就是ob_item[0] int allocat