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代码中的对象的类型。
Python源码学习(一)的更多相关文章
- python源码学习(一)——python的总体架构
python源码学习(一)——python的总体架构 学习环境: 系统:ubuntu 12.04 STLpython版本:2.7既然要学习python的源码,首先我们要在电脑上安装python并且下载 ...
- Python源码学习七 .py文件的解释
Python源码太复杂了... 今天看了下对.py文件的parse, 云里雾里的 py文件是最简单的, 在python的交互式窗口 import这个模块 a = 10 print(a) 开始分析,堆栈 ...
- Python 源码学习之内存管理 -- (转)
Python 的内存管理架构(Objects/obmalloc.c): _____ ______ ______ ________ [ int ] [ dict ] [ list ] ... [ str ...
- Python源码学习Schedule
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- 【转】Python源码学习Schedule
原文:https://www.cnblogs.com/angrycode/p/11433283.html ----------------------------------------------- ...
- Python源码学习之初始化(三)-PyDictObject的初始化
先来看它的定义 typedef struct _dictobject PyDictObject; struct _dictobject { PyObject_HEAD Py_ssize_t ma_fi ...
- Python源码学习十一 一个常用的内存分配函数
void * _PyObject_DebugMallocApi(char id, size_t nbytes) { uchar *p; /* base address of malloc'ed blo ...
- python源码剖析学习记录-01
学习<Python源码剖析-深度探索动态语言核心技术>教程 Python总体架构,运行流程 File Group: 1.Core Modules 内部模块,例如:imp ...
- python 协程库gevent学习--gevent源码学习(二)
在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...
随机推荐
- 织梦dedecms自定义搜索可以按照附加表字段进行搜索
因为需要在网上搜索了一下找到此修改方法: 首先 是新建模型:商标信息 模型:附加表为dede_shangbiao ,附加字段先添加了2个,sbID(商标ID)和chuangyi(创意说明)然后 打开需 ...
- Makefile ------ .PHONY的作用
看下面的例子 Makefile文件 .PHONY: cleanclean: rm *.o 当Makefile文件所在目录有文件名为clean的文件,命令行“.PHONY: clean”又没添加的话,执 ...
- selenium_采集药品数据2_采集所有表格
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- java RSA 加签验签【转】
引用自: http://blog.csdn.net/wangqiuyun/article/details/42143957/ java RSA 加签验签 package com.testdemo.co ...
- java.net.URL 模拟用户登录网页并维持session【转】
java.net.URL 模拟用户登录网页并维持session 半成品,并非完全有用 import java.io.BufferedReader; import java.io.InputStream ...
- jdk1.6 反射性能对比【原】
ReflectPerformance.java package aaa.bbb.ccc; import java.lang.reflect.Method; public class ReflectPe ...
- Study 4 —— 数据类型(1)
基本类型数字字符串布尔 数字 整数 int 在32位机器上,整数的位数为32位,取值范围为-2**31~2**30 在64位机器上,整数的位数为64位,取值范围为-2**63~2**62 ...
- GYM 101173 K.Key Knocking(构造)
原题链接 参考自 问题描述:一个长度为3*n的01串,每次可以翻转连续的两个字符,要求至多翻转n次使得这个3*n的串至少有2*n个连续的段且相邻两端不一样(就是连续的0算一段,然后连续的1,…) 解法 ...
- Elastic Job入门(1) - 简介
介绍 构建一般的业务系统来说,使用Quartz或者Spring Task即可基本满足我们的单体服用应用需要.然而随着线上业务量的不断发展,这两种定时任务已经日渐无法满足我们的需求.一般,使用这两种定时 ...
- PHP二叉树
<?php /******************************************************** * 我写的PHP都是从C语言的数据结构中演化而来********* ...