《Python源码剖析》阅读笔记:第四章-list对象

原创 2012年08月17日 09:13:41

第四章-list对象

 list对象定义:
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
list对象是变长对象,所以有变长对象头
ob_item数组为真正的存储容器,用来存储PyObject对象指针。
ob_size表示list长度。
allocated表示list已分配了多少存储空间。

list的创建分两步。1. 创建list对象本身。2. 为ob_item分配内存。
list的销毁也分两步。1. 回收ob_item的内存。2. 销毁list对象本身。
这样的对象创建和销毁方案是为对象池(free_lists)服务的。
在创建list阶段,Python会查看free_lists中是否有缓存对象。若有,则直接从free_lists取出。若没有,则从堆上分配list对象内存。
在销毁list阶段,若缓存list数(num_free_lists)小于最大可缓存数(MAXFREELISTS ),则将list对象缓存到free_lists备用。若超过了num_free_lists,则直接释放对象内存。

设置元素操作可以理解为list[i] = obj。

插入元素操作:实质是函数ins1的包装。ins1函数的关键操作是,先通过list_resize(下面细说)调整list长度,然后确定插入点。由于Python list的索引可以为负数(即末尾元素索引为-1),所以索引值小于0时得加上长度得到C数组的索引。接着将插入点后的元素向后搬运,在插入点写入对象。从此可以看出list就是C里数组的概念。
list_resize函数:int list_resize(PyListObject *self, Py_ssize_t newsize)
如果allocated / 2 <= newsize <= allocated,则直接把ob_size设置成newsize。如果不在这个范围内,就按如下方案realloc内存:new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
不是很理解为什么采用这个方案,求指教。

删除元素操作:实质是函数app1的包装。app1函数的关键操作是,先找到第一个对象的位置,然后通过list_ass_slice函数将删除点前后的两段合并。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

STL源码剖析_读书笔记:第四章 序列式容器 list篇

List: 特点:1)环状双向链表,对于任何位置的元素插入或删除是常数时间,2)插入和接合不会使原有list迭代器失效 list迭代器:不能以普通指针为迭代器,使用bidirectional it...

《Python源码剖析》阅读笔记:第五章-dict对象

第五章-dict对象  Python里的dict和C++ STL的map一样,都是映射容器(key->value),但实现原理不同。由于Python内部大量使用dict这种结构(比如字符串对象的...

《Python源码剖析》阅读笔记:第三章-字符串对象

第三章-字符串对象  字符串对象定义: typedef struct { PyObject_VAR_HEAD long ob_shash; int ob_sstate; char ob...

《STL源码剖析》---stl_list.h阅读笔记

STL中链表list是一个常用的容器。list在内存中是不连续的双向链表,且是环形的。要了解链表细节是如何操作的话,阅读STL关于链表的代码是最好的方法。

STL源码剖析_读书笔记:第四章 序列式容器 vector篇

数据结构:研究数据排列,利于查找或排序等目的的学科 衍生:表示内涵关系,例如map中含有RB-tree 序列式容器含义:元素都可排序但未必有序   Vector:动态空间,自扩充。吃多少用多少...

python源码剖析笔记1——Python对象初见

python源码剖析笔记1——Python对象初见 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神。很多东西不用就忘记了,比...

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

Python源码剖析笔记2-Python整数对象本文简书地址: http://www.jianshu.com/p/0136ed90cd46 千里之行始于足下,从简单的类别开始分析,由浅入深也不至于...

Python源码学习笔记 5 字典对象

Python中对于字典的实现是根据key进行hash生成散列表,算法为“开放定址法” 1.PyDictEntry 字典中每一个kv对,实际上就是一个entry对象 [dictobject.h...

Python源码学习笔记 2 整数对象

Python中的整数类型是不可变对象,为了提高python运行效率,内部实现了小整数对象池(数组实现),和普通整数缓冲池(单链表实现)。1.PyIntObject 该结构仅适用2.5版本,该版本下...

Python源码学习笔记 4 列表对象

1.PyListObject [listobject.h] typedef struct { PyObject_VAR_HEAD //其中的obsize记录实际使用内存的对象数量 P...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)