本系列讲解python的c语言源码大致结构,基于python2.7,共勉。
python的C语言实现,即CPython。
c语言的基础知识就不介绍了,但有两个重点是需要指出的,结构和指针,这两个东东一定要搞懂。
int string list dict等数据类型其本质都是一种结构(struct)的实例。这个结构有一个统一的头:
#define PyObject_HEAD \
int ob_refcnt; \ //引用计数
struct _typeobject *ob_type; // 类型
注意换行符,这里定义了一个python对象的头,所有python对象,他的头都是这样的两句话。比如python的int即PyIntObiect,他是这样定义的:
typedef struct {
PyObject_HEAD
long ob_ival; // int的值
}PyIntObject;
展开,就是:
typedef struct {
int ob_refcnt;
struct _typeobject *ob_type;
long ob_ival; // int的值
}PyIntObject;
这样,python的int,本质上是一个结构体的类型,这个结构体是按照python的规矩来的,就是在头部加上了统一的东东,那么最简单的python内部对象是什么呢?相信大家已经猜到了。
typedef struct _object {
int ob_refcnt; //引用计数
struct _typeobject *ob_type;
} PyObject;
有了这个,就相当于抓住了python对象的牛鼻子,想想怎m抓?
各位大神,其实,还有一个秘密武器没有做说明,就是“struct _typeobject *ob_type; ”
这个就是python对象的操作函数集合,比如int,有加减乘除和print吧,这些个操作是一个个小函数,统一放在一个类型为_typeobject的结构体中,这个结构体类型大概定义如下:
typedef struct _typeobject{
int ob_refcnt; //引用计数
struct _typeobject *ob_type;
int ob_size;
char *tp_name; //这个类型的名称
数值操作函数。。。
序列化(list)函数。。。
关联操作函数。。。。
}PyTypeObject;
呵呵,说白了,_typeobject就是一些个函数的罗列,各种函数都在那里留了空,往里面填不同的函数,就形成了不同类型对象。还是以int为例,数值操作函数是要填进去的(add、sub、、、),还有tp_name = "int"。此时,变有了PyInt_Type。
所以“struct _typeobject *ob_type; ”可以理解为类型的具体操作表。
现在,回过头来,我们知道牛鼻子在哪里了。

c语言中一个int在64位操作系统下之占用8个字节,但是python内部的int则是一个数据结构,体积一下子就增加了不少,如果总是新建删除,内存频繁的申请和释放,时间的开支很不划算,基本思路就是,在内存中开辟不同的区域,分别存放各种备用对象。
int对象的内存模型是个很有趣的例子,诸君勿急,且听下回分解。
网友评论