标签归档:源码分析

python源码分析:dict对象的实现-2

你是否对上面那个lookdict提出过疑问?

对啦,没有退出语句,它不会成为死循环吧,不会!下面马上提晓答案。

看下面这段代码,位于PyDict_SetItem中:

if (!(mp->ma_used > n_used && mp->ma_fill*3 >= (mp->ma_mask+1)*2))
return 0;
return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used);

即dict在插入数据时,都会检查hash空间使用情况,一旦新添加一条且(dummy+used)的数量小于空间总大小的2/3,就会执行dictresize,就会来扩展原有的hash空间,从而始终保证空间中有空闲位置,这样上面那个’死循环‘的疑问就解决了

2/3:还有一个原因,就是根据统计结果,发现装载率超过2/3后冲突率就会急剧升高。 继续阅读

python源码分析:dict对象的实现-1

首先来看看构建dict的基础设施:

typedef struct {
Py_ssize_t me_hash;
PyObject *me_key;
PyObject *me_value;
} PyDictEntry;

这个结构体为dict中key-value,其中的me_hash为me_key的hash值,[空间换时间]。除此之外,我们发现me_key与me_value都是PyObject指针类型,这也说明了为什么dict中的key与value可以为python中的任何类型数据。

struct _dictobject {
PyObject_HEAD
Py_ssize_t ma_fill; /* # Active + # Dummy */
Py_ssize_t ma_used; /* # Active */
Py_ssize_t ma_mask;
PyDictEntry *ma_table;
PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash);
PyDictEntry ma_smalltable[PyDict_MINSIZE];
}; 继续阅读

python源码分析:list对象的实现

一、List对象的基石:

下面这个结构体囊括了python实现的list的所有信息:list中的内容信息与处理方法

typedef struct {

PyObject_VAR_HEAD

PyObject **ob_item;

Py_ssize_t allocated;

} PyListObject;

下面来分别解释上面的变量含义:

PyObject_VAR_HEAD

:在第一篇的对象实现中,我们知道只要是变长对象的共有内容

PyObject **ob_item:由于每个对象都是由PyObject指针来索引,而列表是存储若干对象,即存储若干指针

。因此,需要一个指针数组(存储指针的数组),即需要一个指针的指针来索引这个数组。 继续阅读

python源码分析:string对象的实现

通过在分析源码与测试分析预期时,我们发现这样一个现象,就是python的这些基础数据类型(intstringlistdict)其实在实现python时(注意,是实现python自身时)就开始运用了。比如后面说到的stringintern机制就使用了dict来形成映射。好了,言归正传,下面开始分析任何语言中最为关键的数据类型:String类型。 继续阅读

Python源码分析 :整数对象的实现-1

python中的对象分两种:可变对象与不可变对象。

intfloatstring,元组就是不可变对象;list,map及自定义对象就是可变对象。

好了,现在知道python中一切皆对象并且int为不可变对象,想像一下一个for循环:

for I in ragne(1,1000):

print I

就会出现不停地生成对象然后销毁对象。靠,这不是在烧CPU是在干什么。显然,python的发明者肯定不会做这样的蠢事。那么他是怎么完成的呢? 继续阅读