专栏首页鸿的学习笔记python源码阅读笔记之GC(一)

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),作者:鸿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 简单聊聊Python解释器(一)

    Python的解释器,从运行过程上来说就是在模拟一个CPU的处理,只要理解了这一点,python中鼎鼎大名的全局解释锁和多进程也就能够理解了。(Ps:在远古时...

    哒呵呵
  • python源码阅读笔记之字符串对象

    哒呵呵
  • 2018的第一份书单

    1.《fluent python》(中文版:《流畅的python》) 这本书来源于某个公众号的推荐(忘了是哪个了),在读这本书之前,已经阅读了市面上很多pyth...

    哒呵呵
  • python与c语言的区别以及python的小小基础

    黑泽君
  • Python入门-HelloWorld、开发环境、开发工具

    1.搭建开发环境 a.进入官网www.python.org,点击“Download”-“Windows”(或其他操作系统) ? b.选择Python版本下载(注...

    企鹅号小编
  • python3+ selenium3开发环境搭建-手把手教你安装python(详细)

    基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器;没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握...

    北京-宏哥
  • 从0开始的Python学习001快速上手手册

    Happy、Liu
  • GitHub 搜索骚技巧,太好用了!

    作者:Suwanbin 链接:www.cnblogs.com/suwanbin/p/12113751.html

    用户6543014
  • 恕我直言,你连 Github 都不会用!

    | 链接:www.cnblogs.com/suwanbin/p/12113751.html

    一个优秀的废人
  • BlockCanary原理分析

    用户1205080

扫码关注云+社区

领取腾讯云代金券