zoukankan      html  css  js  c++  java
  • Python基础教程之List对象 转

    Python基础教程之List对象

    时间:2014-01-19    来源:服务器之家    投稿:root
     
    1、PyListObject对象
    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 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);
     
  • 相关阅读:
    微信小程序实现滚动到指定位置
    微信小程序,scroll-view组件的使用,跳转到指定的锚点/定位跳转
    小程序,报渲染层错误。图片无法渲染。
    input Input 输入判断/正则
    js,某元素在浏览器页面浮动/飘动
    前端模块化
    npx create-react-app命令不成功,更改成淘宝镜像
    深入理解jdk和jre(转)
    Java学习路线图·影响一代又一代程序员的经典书籍!(转)
    ZAB协议(转)
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5506664.html
Copyright © 2011-2022 走看看