《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函数将删除点前后的两段合并。


《Python 源码剖析》一些理解以及勘误笔记(3)

以下是本人阅读此书时理解的一些笔记,包含一些影响文义的笔误修正,当然不一定正确,贴出来一起讨论。 注:此书剖析的源码是2.5版本,在python.org 可以找到源码。纸质书阅读,pdf 贴图。 ...
  • Simba888888
  • Simba888888
  • 2015年05月09日 11:57
  • 3038

《STL源码剖析》学习笔记

第二章:空间配置器(allocator) 考虑到小型区块可能造成的内存破碎问题,SGI设计了双层级配置器。 当配置区块超过128bytes时,便调用第一级配置器,即直接使用malloc() free(...
  • qiaominghe
  • qiaominghe
  • 2016年05月27日 09:05
  • 1536

Python源码剖析笔记7-类机制

拖了好一段时间了,终于有空来看看python中的类机制了。内容太多,感觉有些地方还是模糊的,先写一些吧,有错误烦请指出。 1 Python对象模型1.1 概述python2.2之前的这里就不考虑了,从...
  • ssjhust123
  • ssjhust123
  • 2015年10月11日 19:49
  • 1469

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

1.PyListObject对象 --> 变长可变对象,可看作vector typedef struct{ PyObject_VAR_HEAD //其中的ob_size表示实际被使用的内存的数量 ...
  • zhsenl
  • zhsenl
  • 2014年06月15日 18:34
  • 868

《Python 源码剖析》一些理解以及勘误笔记(3)

以下是本人阅读此书时理解的一些笔记,包含一些影响文义的笔误修正,当然不一定正确,贴出来一起讨论。 注:此书剖析的源码是2.5版本,在python.org 可以找到源码。纸质书阅读,pdf 贴图。 ...
  • Simba888888
  • Simba888888
  • 2015年05月09日 11:57
  • 3038

《STL源码剖析》Sort排序分析

整体而言: sort算法在数据量大时采用Quick Sort(快速排序),一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负担,就改用Insertion Sort(插...
  • m0_37316917
  • m0_37316917
  • 2017年04月02日 19:30
  • 416

《Python源码剖析》读书笔记

《Python源码剖析》电子书下载 http://download.csdn.net/detail/xiarendeniao/5130403 Python源码在官网有下载链接,用ctags -R ...
  • xiarendeniao
  • xiarendeniao
  • 2013年07月14日 23:29
  • 6819

Java集合框架之List---ArrayList与LinkedList源码分析

一、 ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。   ArrayList不是线程安全的,只能用在单线程...
  • oChangWen
  • oChangWen
  • 2016年01月26日 13:51
  • 3198

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

在python中,所有的东西都是对象,整数是,方法也是,。。总之什么都是。。。。 在看python的代码实现中,可以随处看到指针类型:PyObject*,那么我们就先来看看PyObject这到底是怎么...
  • fjs_cloud
  • fjs_cloud
  • 2015年05月18日 12:51
  • 925

Python_List对象内置方法详解

目录目录 前言 软件环境 列表List 修改列表的元素 插入列表元素 extend 将序列中的元素迭代的附加到list中 insert 在指定的索引号中插入一个元素 删除列表元素 del 删除List...
  • Jmilk
  • Jmilk
  • 2015年11月01日 19:54
  • 2852
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Python源码剖析》阅读笔记:第四章-list对象
举报原因:
原因补充:

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