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

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的核心

对象的结构
结构体名  对应的内置数据类型
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()

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2017-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青蛙要fly的专栏

项目需求讨论--可能是用InputFilter来做的最好的金额限制

看惯了可能是XXX最好的,可能是XXXX目前最好的,今天我也用下这个标题,哈哈。别喷我,当然我也就吹吹牛。有很多好的方法来实现。

1652
来自专栏Spark学习技巧

Flink DataStream编程指南

Flink程序是执行分布式集合转换(例如,filtering, mapping, updating state, joining, grouping, defi...

2K7
来自专栏用户1191492的专栏

物联网平台设计文档:精简GC(垃圾回收)

许多高级编程语言的自动内存管理功能让编程变成了比较容易的一件事。然而,嵌入式平台经常缺少这一部分功能,这是有原因的:现代垃圾收集(GC)系统使用的...

2955
来自专栏窗户

python和C语言混编的几种方式

  Python这些年风头一直很盛,占据了很多领域的位置,Web、大数据、人工智能、运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚...

35710
来自专栏编程之旅

数据结构——无权图的路径问题(C++和java实现)

好像又是接近半个月没有更新,这半个月忙着结婚的各项事情,本来预计的学习任务也拖拖拉拉,进度缓慢。吐槽一句,拍婚纱照真的是最非常非常累的一件事情,不想再有下次了。

1172
来自专栏个人随笔

Java工具类 通过ResultSet对象返回对应的实体List集合

4165
来自专栏LinkedBear的个人空间

唠唠SE的面向对象-02——封装 原

1) 我们日常使用的电脑主机,把cpu、内存、主板等等都封装到机箱里面去。假如没有机箱的话的出现什么问题?

983
来自专栏LeoXu的博客

Flex笔记_格式化数据 原

注意:上述代码没有输出结果是因为Flex内部会把XML转换成一组高级对象,既不是Date也不是String,而format函数只接受这两种对象作为参数,因此代码...

882
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[4-9]

  本文首先亦同步到http://www.cnblogs.com/aehyok/p/3624579.html。本文主要来学习记录一下内容:

1425
来自专栏iOS

深入理解苹果系统(Unicode)字符串的排序方法

本文主要讲述下载苹果系统-方法所引发的对排序规则的深入研究。

4667

扫码关注云+社区

领取腾讯云代金券