PyListObject对象

Python中的list支持对元素的插入、添加和删除的操作。它是可变对象而且是一个变长对象。

看下PyListObject的定义:

typedef struct{

   PyObject_VAR_HEAD

   PyObject * ob_item ;

   int allcoated ;

 } PyListObject ;

 

ob_item指向PyListObject所维护的元素列表所在内存块的首地址。

PyListObject所采用的内存管理机制与c++中的vector所采用的内存管理机制相同,幷不是存多少东西就申请对应大小的空间, 

而是一次申请一大块内存空间,allocated存储这一大块内存空间可容纳的元素个数。ob_size存储这一大块内存空间中已存储的元素个数。

 Python提供PyList_New来生成一个PyListObject对象,它有一个参数size,指定该对象所维护的元素列表的初始元素个数。

PyObject * PyList_New( int size )

{

     PyListObject * op;

     size_t nbytes ;

     //内存数量计算

    nbytes = size*sizeof(PyObject*) ;

    //检查内存是否溢出,这种检查方式到是很特别

    if( nbytes/sizeof(PyObject*) != size )

          return PyErr_NoMemory() ;

    if( num_free_lists)

   {

        //缓冲区可用

         num_free_lists -- ;

         op = free_lists[num_free_lists] ;

         _Py_NewReference( (PyObject*)op) ;

   }

   else

   {

       //缓冲区不可用

       op = PyObject_GC_New(PyListObjects , &PyList_Type) ;

      //据说该函数除了申请内存外,还为Python中的自动垃圾收集机制做一些工作

    }

    if( size<=0 )

        op->item = NULL ;

    else

    {

       op->item = ( PyObject *)PyMem_MALLOC(nbytes) ;

       memset( op->item , 0 , nbytes) ;

     }

     op->ob_size = size ;

     op->allocated = size ;

     return (PyObject *)op ;

}

   

    memset(op->item , 0 , sizeof(

  /* python为list对象也提供了缓冲池,定义如下:

    # define MAXFREELISTS   80

    static PyListObject * free_lists[MAXFREELISTS] ;

    static int num_free_lists = 0 ;

    那个free_lists是在何处初始化的呢,它用将要删除的PyListObject对象初始化,当要删除一个PyListObject对象时,幷不删除

    PyListObject对象,而只是删除PyListObject对象所维护的元素列表及其指向的对象。

    看下系统清理一个对象的源码:

    static void list_dealloc(PyListObject *op)

    {

        int i ;

        if( op->item != NULL )

        {

             i = op->ob_size ;

             while( --i>0 )

            {

                  Py_XDECREF(op->ob_item[i]) ;

            }

            PyMem_FREE(op->ob_item) ;

        }

        if( num_free_lists < MAXFREELISTS && PyList_CheckExact(op) )

              free_lists[num_free_lists++] = op ;

       else

             op->type->tp_free((PyObject*)op) ;

     }

*/

  

 

  

 

 

 

 

posted on 2010-06-09 17:33  liuze  阅读(1497)  评论(0编辑  收藏  举报