python源码阅读: 参考书籍:《python源码剖析》 摘要:写这个系列的目的呢,是想为python的学习画上一个暂时的句号,接下来的重点应该是scala这门语言和其身后的函数式编程思想了。整个文章大概会分为python的对象体系(主要是container对象的字典以及字符串),函数和类的运行机制,模块的动态加载,线程机制,垃圾回收机制。不会做到面面俱到,但是会尽量把底层的代码展现给大家,这次的python的源码使用的是python 2.7.2版本。 一、源码的目录体系和整体架构 File Groups Python Core Runtime Environment Core Modules SCanner Object/Type Structures Library Parser Memory Allocator User-defined Compiler Current State Of Python Modules Code Evauator 简单来说,你可以把python的解释器视为一个优秀的编译原理实践,ANSI C实现的。遵循了最流行的词法分析,解析成token,再语法分析,建立抽象语法树AST,最后compiler根据AST,生成字节码,执行。 目录 概要 Demo python的演示程序,里面包括了CGI,class演示等 Doc python的文档 Grammar python的语法文件 Include python编译时引用的头文件 Lib 标准附加库 Mac Mac用的工具 Misc 各种文件的集合(例如vim) Modules python的C语言扩展 Objects python的对象使用的C语言代码 PC 依存于操作环境 PCbuild 构造win32和x64用的 Parser python用的解析器 Python python的核心
代码语言:javascript复制对象的结构
结构体名 对应的内置数据类型
PyListObject 列表型
PyTupleObject 元组型
PyDictObject 字典型
PyFloatObject 浮点型
PyLongObject 长整形
让我们看看各个数据类型的struct吧
浮点型
typedef struct {
PyObject_HEAD
double ob_fval;
} PyFloatObject;
列表型
typedef struct {
PyObject_VAR_HEAD
/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */
PyObject **ob_item;
/* ob_item contains space for 'allocated' elements. The number
* currently in use is ob_size.
* Invariants:
* 0 <= ob_size <= allocated
* len(list) == ob_size
* ob_item == NULL implies ob_size == allocated == 0
* list.sort() temporarily sets allocated to -1 to detect mutations.
*
* Items must normally not be NULL, except during construction when
* the list is not yet visible outside the function that builds it.
*/
Py_ssize_t allocated;
} PyListObject;
元组型
typedef struct {
PyObject_VAR_HEAD
PyObject *ob_item[1];
/* ob_item contains space for 'ob_size' elements.
* Items must normally not be NULL, except during construction when
* the tuple is not yet visible outside the function that builds it.
*/
} PyTupleObject;
字典型
typedef struct {
/* Cached hash code of me_key. Note that hash codes are C longs.
* We have to use Py_ssize_t instead because dict_popitem() abuses
* me_hash to hold a search finger.
*/
Py_ssize_t me_hash;
PyObject *me_key;
PyObject *me_value;
} PyDictEntry;
长整形
typedef struct _longobject PyLongObject;
让我们特别注意下PyObject这个定义
typedef struct _object {
PyObject_HEAD
} PyObject;
再让我们继续深入看看
#define PyObject_HEAD
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
ob_refcnt这个参数就是python引用计数的核心
所有的内置结构体都包含了这个结构体
python的内存结构:
第三层 字典,元组,数值,字符串,列表等
第二层 对象特有的内存分配器
第一层 python的低级内存分配器
第0层 通用的基础分配器
第-1层 OS特有的虚拟内存管理器
第-2层 物理内存和交换目的地
大致的层数调用如下:
PyDict_New()
PyObject_GC_New()
PyObject_Malloc()
new_arena()
malloc()