(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 函数c()_函数的调用

    函数c()_函数的调用__builtin_系列函数

    2025年6月24日
    2
  • 转-数据校验手段-哈希算法

    转-数据校验手段-哈希算法理解哈希是理解数字签名和加密通信等技术的必要前提。哈希,英文是hash,本来意思是”切碎并搅拌“,有一种食物就叫Hash,就是把食材切碎并搅拌一下做成的。哈希函数的运算结果就是哈希值,通常简

    2022年7月2日
    27
  • vs 序列号密钥「建议收藏」

    vs 序列号密钥「建议收藏」2003序列号: D64GG-GXY6T-V6FTR-WCPBB-2YDYB T7KXG-78HXC-JYRF8-72VH2-6DM7M2005序列号: KGR3T-F2C26-RRTGT-D6DQT-QBBB32008序列号: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT WPX3J-BXC3W-BPYWP-PJ8CM-F7M8T2013序列号: BWG7X-J98B3-W34RT-33B3R-JVYW92015序列号:专业版:HMGNV-WCYXV-X7G9W-YCX6

    2022年5月24日
    63
  • 软件测试总结——常见的面试问题(一)

    软件测试总结——常见的面试问题(一)1.软件测试级别?单元测试:单元测试是对软件组成单元进行测试。其目的是检验软件基本组成单位的正确性。测试的对象是软件设计的最小单位:模块。Findyou又称为模块测试,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。(测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试)集成测试:(集成测试也称联合测试、组装测试,将程序模块采用适当的集成策略组装起…

    2022年5月29日
    32
  • mysql executereader_C# 操作MySQL数据库, ExecuteReader()方法参数化执行T-SQL语句, 游标读取数据…

    mysql executereader_C# 操作MySQL数据库, ExecuteReader()方法参数化执行T-SQL语句, 游标读取数据…C#操作MySQL数据库需要引用”MySql.Data”,可通过两种方式获取。1、从NuGet下载”Install-PackageMySql.Data-Version6.8.7″推荐使用方式一,从NuGet上直接获取所需dll,方便快捷。C#操作MySQL数据库,ExecuteReader()方法参数化执行T-SQL语句,游标读取数据–ExecuteNonQuery()对连接执…

    2022年6月20日
    28
  • spring boot redis 缓存_redis本地缓存

    spring boot redis 缓存_redis本地缓存SpringBoot集成Redis缓存查询操作是应用中最常见的操作,如果每次查询都从MySQL中查询则会影响效率,通常需要引入缓存来实现查询性能的优化。缓存可以选择本地缓存,远程缓存或本地缓存结合远程缓存。本地缓存可以使用Guava或Caffeine提供的解决方案,而远程缓存则可以选择Redis这样的内存数据库。本文记录一下SpringBoot集成Redis做缓存的相关配置。1引入依赖引入相应Starter。<dependency><gr

    2025年12月10日
    5

发表回复

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

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