程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> (Python學習4)List對象

(Python學習4)List對象

編輯:Python

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
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved