码迷,mamicode.com
首页 > 编程语言 > 详细

python 整数对象PyIntObject的创建和维护

时间:2017-03-04 22:16:20      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:lock   思路   nts   http   free   链表   基本操作   共享   对象内存   

整数对象的创建有以下几种,并非书中所述3种

技术分享

从源码中看到最终都是调用PyInt_FromLong,书中写的PyInt_FromFloat,需要注意这点。

所以重点阅读函数PyInt_FromLong:

技术分享

方便用户直接取用,小整数对象池是python运行是就必须存在的。按照这个思路,那么小整数对象池的初始化就应该在PyIntObject的_init中,在源码中也证实了这个思路:

技术分享

small_ints数组管理着小整数对象的指针。在PyInt_FromLong函数中,小数值对象就是在这个数组中取出来的。

 

大整数对象没有使用对象池,是直接分配一块内存block让其使用。block中管理若干PyIntObject

技术分享

从源码中可以知道,这个block大约1K的大小。指针free_list和block_list分别代表单链表的表头和表尾。单链表的基本操作就是C语言中的链表操作。就不在详述。

在PyInt_FromLong中,可以看到创建大整数对象的block使用的函数是fill_free_list

技术分享

看到这里将数组转成链表,的确很惊讶。但是这样做的确提高了对空闲整数对象内存的使用。

 

总结: python 2.5中整数对象的创建和使用比较频繁,为了提高效率,采用了共享内存的方式,缓存了常用的整数。

         代码修改测试

按照原书上的修改如下:

技术分享

重新编译后:

技术分享

分析结果和书上所述一致。 然后建议再返回看第一章的内容,更深入的理解python内建数据对象

 

python 整数对象PyIntObject的创建和维护

标签:lock   思路   nts   http   free   链表   基本操作   共享   对象内存   

原文地址:http://www.cnblogs.com/XiangWei1/p/6502754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!