Python源码学习(一)

考虑到性能的要求,我在工作中用的最多的是c/c++,然而,工作中又经常会有一些验证性的工作,这些工作对性能的要求并不高,反而对完成的效率要求更高,对于这样的工作,用一种开发效率高的语言是合理的想法,鉴于python的流行以及为大家所称道的开发效率和灵活性,我便开始渐渐多的接触起python来。可是,问题又来了,用python验证完了之后,需要优化性能,甚至移植到c/c++里面来,这时候,愈发觉得有必要深入学习python,了解其内部原理。经过一番搜索,找到了这本《Python源码剖析》,开始了我的python深入学习之旅。

一、Python对象初探

python语言中的一切,包括变量和变量类型,底层都是靠c语言的某种对象/结构体来实现的。也可以理解为,python中所有的东西都是用c的对象来实现的(这里理解为struct的对象)。这些所有对象都对应的定义中,开头的部分是相同的,都是PyObject:

[object.h]
typedef struct _object {
    PyObject_HEAD
} PyObject;
[object.h]
#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
    #define _PyObject_HEAD_EXTRA                struct _object *_ob_next;           struct _object *_ob_prev;
    #define _PyObject_EXTRA_INIT 0, 0,
#else
    #define _PyObject_HEAD_EXTRA
    #define _PyObject_EXTRA_INIT
#endif

/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD           \
    _PyObject_HEAD_EXTRA            int ob_refcnt;              struct _typeobject *ob_type;

整型变量ob_refcnt与Python的内存管理机制有关,它实现了基于引用计数的垃圾收集机制。而ob_type是一个指向_typeobject结构体的指针,_typeobject结构体定义了所指向对象的类型,定义如下:

[object.h]
typedef struct _typeobject {
    PyObject_VAR_HEAD
    char *tp_name; /* For printing, in format "<module>.<name>" */
    int tp_basicsize, tp_itemsize; /* For allocation */

    /* Methods to implement standard operations */
    destructor tp_dealloc;
    printfunc tp_print;
    ……
    /* More standard operations (here for binary compatibility) */
    hashfunc tp_hash;
    ternaryfunc tp_call;
    ……
} PyTypeObject;

也就是说PyTypeObject这个结构体定义了python的c代码中的对象的类型。

时间: 2024-10-13 10:53:42

Python源码学习(一)的相关文章

python源码学习(一)——python的总体架构

python源码学习(一)——python的总体架构 学习环境: 系统:ubuntu 12.04 STLpython版本:2.7既然要学习python的源码,首先我们要在电脑上安装python并且下载python的源码,ubuntu 12.04 STL自带的python版本为2.7.3,这就可以了,接下来下载源码,下载python2.7.7的源代码,下载结束后解压文件,我们会看到如下文件结构:,接下来介绍一下,demo文件夹里放的是一些例子:Doc文件夹里放的是文档,Grammer是语法分析器,

Python 源码学习二(SocketServer)

SocketServer这个模块中定义的类比较多,但是设计比较清晰,我们以TCPServer为主线分析,先脉络再细节. 总体脉络 将相关类分为两组,如图: 服务器相关(上) BaseServer是server基础类,定义server的基本处理运行与request处理机制,TCPServer直接继承它. Request处理类RequestHandler(下) BaseRequestHandler是request处理的基础类,TCPServer的request处理类StreamRequestHand

python 协程库gevent学习--gevent源码学习(二)

在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用monkey_patchall()之后隐式切换的问题. 下面我将继续通过分析源码及其行为来加以理解和掌握. 1. 关于gevent.Greenlet.join()(以下简称join)先来看一个例子: import gevent def xixihaha(msg): print(msg) gevent.sl

Python源码分析(一)

最近想学习下Python的源码,希望写个系列博客,记录的同时督促自己学习. Python源码目录 从Python.org中下载源代码压缩包并解压,我下载的是Python2.7.12,解压后: 对于主要的文件夹做出介绍: Include:包含Python提供的所有头文件,如果需要自己使用C或者C++编写自定义模块扩展Python,就需要用到这里的头文件: Lib: 包含Python自带的所有标准库,全部由Python语言编写: Modules:包含了所有使用C语言编写的模块: Parser:Pyt

Python源码剖析笔记3-Python执行原理初探

Python源码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源码剖析笔记,然而慢慢觉得没有从一个宏观的角度理解python执行原理的话,从底向上分析未免太容易让人疑惑,不如先从宏观上对python执行原理有了一个基本了解,再慢慢探究细节,这样也许会好很多.这也是最近这么久没有更新了笔记了,一直在看源码剖析书籍和源码,希望能够从一个宏观层面理清python执行原理.人说读书从薄读厚,再从厚读薄方是理解了

Python源码剖析笔记0 ——C语言基础

python源码剖析笔记0--C语言基础回顾 要分析python源码,C语言的基础不能少,特别是指针和结构体等知识.这篇文章先回顾C语言基础,方便后续代码的阅读. 1 关于ELF文件 linux中的C编译得到的目标文件和可执行文件都是ELF格式的,可执行文件中以segment来划分,目标文件中,我们是以section划分.一个segment包含一个或多个section,通过readelf命令可以看到完整的section和segment信息.看一个栗子: char pear[40]; static

python源码剖析

作为主流的动态语言,Python不仅简单易学.移植性好,而且拥有强大丰富的库的支持.此外,Python强大的可扩展性,让开发人员既可以非常容易地利用C/C++编写Python的扩展模块,还能将Python嵌入到C/C++程序中,为自己的系统添加动态扩展和动态编程的能力. 为了更好地利用Python语言,无论是使用Python语言本身,还是将Python与C/C++交互使用,深刻理解Python的运行原理都是非常重要的.<动态语言技术精品书廊·Python源码剖析:深度探索动态语言核心技术>以C

《统计学习方法》-逻辑回归笔记和python源码

逻辑回归(Logistic regression) 逻辑回归是统计学习中的经典分类方法.其多用在二分类{0,1}问题上. 定义1: 设X是连续随机变量,X服从逻辑回归分布是指X具有下列分布函数与密度函数: 分布函数属于逻辑斯谛函数,其图形是一条S形曲线. 定义2: 二项逻辑斯谛回归模型是如下条件概率分布: 从上式可以看出,逻辑回归对线性回归经行了归一化操作,将输出范围规定在{0,1}. 现在来看,逻辑回归的的特点,几率,指一件事件发生的概率与不发生的概率的比值.对上式分别求对数,我们可得如下式子

【Python】linux系统more基本命令python源码分享

此python源码是linux系统more基本命令的实现.实现linux中more的基本功能,当more后加一个文件名参数时候,分屏显示按空格换页,按回车换行',在左下角显示百分比:以处理管道参数的输入,处理选项+num:从指定行开始显示,+/string :查找字符串,从指定字符串之后开始显示 运行环境:安装有PYTHON的linux系统 调用示例:more.py [+num ] [+/pattern] filenamecommand|./more.py [+num ] [+/pattern]