考慮到性能的要求,我在工作中用的最多的是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代碼中的對象的類型。