python源码阅读笔记之GC(一)

2018-08-06 15:30:14 浏览数 (1)

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()

0 人点赞