(Python学习4)List对象

1、PyListObject对象PyObject_VAR_HEAD中的obsize表示该list对象含有的元素个数,而allocated表示该list对象占用的内存空间。ob_item实际指向一个指

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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。

(Python学习4)List对象

 

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对象。
(Python学习4)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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120546.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql磁盘阵列部署_部署磁盘阵列

    mysql磁盘阵列部署_部署磁盘阵列1、mdadm命令用于管理Linux系统中的软件RAID硬盘阵列,格式为mdadm[模式][选项][成员设备名称]常用命令:mdadm-D/dev/md0#md0为自定义设备名,查看详细信息2、mdadm命令的常用参数和作用-a  检测设备名称-n  指定设备数量-l  指定RAID级别-C  创建(阵列卡)-v  显示过程-f   模拟设备损坏-r   …

    2022年6月12日
    40
  • 利用matlab画图(r语言能画出哪些图)

    clearallcloseallloadyi.txta=yi;b={‘北京”天津”石家庄”唐山”秦皇岛”太原”呼和浩特”包头’…’沈阳”大连”丹东”锦州”长春”吉林’…

    2022年4月17日
    41
  • 二叉树的最大深度和最小深度浅析

    二叉树的最大深度和最小深度浅析

    2021年9月15日
    51
  • Linux内存管理机制_linux ntp同步命令

    Linux内存管理机制_linux ntp同步命令Linux中的线程同步机制(一)–Futex引子在编译2.6内核的时候,你会在编译选项中看到[*]Enablefutexsupport这一项,上网查,有的资料会告诉你”不选这个内核不一定能正确的运行使用glibc的程序”,那futex是什么?和glibc又有什么关系呢?1.什么是FutexFutex是FastUserspacemuTexes的缩写,由Hu

    2022年9月21日
    2
  • idea 运行单个main方法_idea如何运行main方法[通俗易懂]

    idea 运行单个main方法_idea如何运行main方法[通俗易懂]使用IntelliJIdea打包可执行JAR1、Model结构如下:…IDEA发布1.8.1配置编译class的环境1.8.2配置web环境1.8.3发布到tomcat运行环境中1.8.4启动运行1.8.5发布到war文件操作完成后进入下一……Main-Class:Main这边Main既是运行类,含有main()方法的一个类文…

    2022年5月31日
    376
  • python垃圾回收机制原理

    python垃圾回收机制原理#python垃圾回收机制详解一、概述:  python的GC模块主要运用了“引用计数(referencecounting)”来跟踪和回收垃圾。在引用计数的基础上,还可以通过标记清除(markandsweep)解决容器(这里的容器值指的不是docker,而是数组,字典,元组这样的对象)对象可能产生的循环引用的问题。通过“分代回收(generationcollection)”以空间换取时间来进一步提高垃圾回收的效率。二、垃圾回收三种机制  1、引用计数  在Python中,大多数对象的生命周

    2022年6月24日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号