zoukankan      html  css  js  c++  java
  • (Python学习4)List对象

    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

    转自:http://hovertree.com/h/bjaf/pythonlist.htm

    推荐:http://www.cnblogs.com/roucheng/p/pythonyunsuan.html

  • 相关阅读:
    Qt:移动无边框窗体(使用Windows的SendMessage)
    github atom 试用
    ENode框架Conference案例转载
    技术
    NET 领域驱动设计实战系列总结
    mac 配置Python集成开发环境
    User、Role、Permission数据库设计ABP
    Oracle 树操作
    Oracle 用户权限管理方法
    Web Api 2, Oracle and Entity Framework
  • 原文地址:https://www.cnblogs.com/roucheng/p/pythonlist.html
Copyright © 2011-2022 走看看