Python源碼學習(一)

      考慮到性能的要求,我在工做中用的最多的是c/c++,然而,工做中又常常會有一些驗證性的工做,這些工做對性能的要求並不高,反而對完成的效率要求更高,對於這樣的工做,用一種開發效率高的語言是合理的想法,鑑於python的流行以及爲你們所稱道的開發效率和靈活性,我便開始漸漸多的接觸起python來。但是,問題又來了,用python驗證完了以後,須要優化性能,甚至移植到c/c++裏面來,這時候,愈發以爲有必要深刻學習python,瞭解其內部原理。通過一番搜索,找到了這本《Python源碼剖析》,開始了個人python深刻學習之旅。python

1、Python對象初探c++

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代碼中的對象的類型。優化

相關文章
相關標籤/搜索