标签: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内建数据对象
标签:lock 思路 nts http free 链表 基本操作 共享 对象内存
原文地址:http://www.cnblogs.com/XiangWei1/p/6502754.html