Python基础教程之List对象 转
Posted zengkefu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础教程之List对象 转相关的知识,希望对你有一定的参考价值。
Python基础教程之List对象
时间:2014-01-19 来源:服务器之家 投稿:root
1、PyListObject对象
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
创建时,可指定大小,据此开辟元素列表所需内存。
op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
memset(op->ob_item, 0, nbytes);
新建list对象后,可插入、添加、删除元素。若allocated不足,可自动申请内存空间。
Python中list的内存增长模型如下:
0, 4, 8, 16, 25, 35, 46, 58, 72, 88
实现方式为:
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
删除list对象时
i = Py_SIZE(op);
while (--i >= 0) { // 逐一减小对真实PyObject对象的引用
Py_XDECREF(op->ob_item[i]);
}
PyMem_FREE(op->ob_item); // 然后释放元素指针列表
static PyListObject *free_list[PyList_MAXFREELIST];
free_list是指针数组,指针指向list对象。
numfree--;
op = free_list[numfree];
_Py_NewReference((PyObject *)op);
}
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
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);
新建list对象后,可插入、添加、删除元素。若allocated不足,可自动申请内存空间。
Python中list的内存增长模型如下:
0, 4, 8, 16, 25, 35, 46, 58, 72, 88
实现方式为:
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
删除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 80static 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);
}
free_list[numfree++] = op;
else // 否则直接销毁
Py_TYPE(op)->tp_free((PyObject *)op);
op = PyObject_GC_New(PyListObject, &PyList_Type);
}
删除List对象时:
if (numfree < PyList_MAXFREELIST) // 如果有空余空间,将list对象放入free_Listfree_list[numfree++] = op;
else // 否则直接销毁
Py_TYPE(op)->tp_free((PyObject *)op);
以上是关于Python基础教程之List对象 转的主要内容,如果未能解决你的问题,请参考以下文章