1、PyListObject對象
typedef struct { PyObject_VAR_HEAD PyObject **ob_item; Py_ssize_t allocated; } PyListObject; # 何問起 hovertree.com
PyObject_VAR_HEAD中的obsize表示該list對象含有的元素個數,而allocated表示該list對象占用的內存空間。ob_item實際指向一個指針數組,該數組中的每個指針指向真正的PyObject。
2、PyListObject對象使用
創建時,可指定大小,據此開辟元素列表所需內存。
op->ob_item = (PyObject **) PyMem_MALLOC(nbytes); memset(op->ob_item, 0, nbytes); # 何問起 hovertree.com
新建list對象後,可插入、添加、刪除元素。若allocated不足,可自動申請內存空間。
Python中list的內存增長模型如下:
0, 4, 8, 16, 25, 35, 46, 58, 72, 88
實現方式為:
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6); # 何問起 hovertree.com
刪除list對象時
i = Py_SIZE(op); while (--i >= 0) { // 逐一減小對真實PyObject對象的引用 Py_XDECREF(op->ob_item[i]); } PyMem_FREE(op->ob_item); // 然後釋放元素指針列表
而該List對象是否銷毀,如下。
3、PyListObject對象緩沖池
#define PyList_MAXFREELIST 80 static PyListObject *free_list[PyList_MAXFREELIST];
free_list是指針數組,指針指向list對象。
創建List對象時:
if (numfree) { #如果free_list有空閒,直接指向 numfree--; op = free_list[numfree]; _Py_NewReference((PyObject *)op); } else { # 否則新開辟內存空間 op = PyObject_GC_New(PyListObject, &PyList_Type); }
刪除List對象時:
if (numfree < PyList_MAXFREELIST) # 如果有空余空間,將list對象放入free_List free_list[numfree++] = op; else # 否則直接銷毀 Py_TYPE(op)->tp_free((PyObject *)op); # 何問起 hovertree.com