hongweipeng 发布的文章

Python内核阅读(六): Dict对象


起步

python中PyDictObject采用了散列表,平均状况是O(1)复杂度的搜索效率.

散列表是通过一定的函数将需搜索的键值映射为一个整数,将这个整数视为索引去访问某片连续的内存区域. 一般情况下,hash table会申请一块较大的连续内存通过映射函数f(n)得到所对应的索引.

在使用散列表过程中,随着需要存储的数据增多,hash冲突的概率就越高.会直接影响到hash的效率和性能.

在python中采用闭散列法来解决冲突,闭散列法也称为开放定址法.当产生冲突时,python会通过一个二次探测函数f,计算下一个候选索引, 如果索引不可用,就再次用f探测.直到找到一个可用的位置.

之所以叫做闭散列法,就是因为冲突的元素没有开辟额外的存储空间,还是在原先hash表的空间范围之内。


Python内核阅读(四): 字符串对象


起步

在python3中,默认的字符串采用了unicode编码方式,它的结构定义为:

[unicodeobject.h]
typedef struct {
    PyCompactUnicodeObject _base;
    union {
        void *any;
        Py_UCS1 *latin1;
        Py_UCS2 *ucs2;
        Py_UCS4 *ucs4;
    } data;                     /* Canonical, smallest-form Unicode buffer */
} PyUnicodeObject;


Python内核阅读(二): 对象的创建


起步

python提供两种来创建对象, 一种是C API, 第二种通过类型对象创建,如 PyLong_Type .

在C API中也有两类, 一类是泛型的API,形式如 PyObject_xxx ,可以应用在任何python对象上, PyObject_Print([int obj]|[string obj]) .参数可以任意类型,其API内部自己确定最终调用的函数是哪一个.

另一类与类型相关的API,如:

PyObject *a = PyLong_FromLong(10);

不论采用哪种C API,最终都是直接分配内存.