標籤:targe stand call typedef var str 計數 pointer 對象
考慮到效能的要求,我在工作中用的最多的是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源碼學習(一)