(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语言xml配置文件换行的方法[通俗易懂]

    C语言xml配置文件换行的方法[通俗易懂]/options参数设定成XML_PARSE_NOBLANKS,否则的话是不会在结点后面添加回车的。/doc=xmlReadFile(docname,“UTF-8”,XML_PARSE_NOBLANKS);//读取xml文件时忽略空格/把xmlSaveFormatFile的format参数修改成1,否则在使用xmlReadFile打开的xml文件时,在生成的xml文件里是会把所有的结点都放到一行里显示。/xmlSaveFormatFile(docname,doc,1);以上内容

    2022年7月12日
    16
  • 滚动条三要素scrollTop clientHeight scrollHeight

    滚动条三要素scrollTop clientHeight scrollHeight<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″> <title></title> <scriptsrc=”js/jquery-3.3.1.min.js”type=”text/javascript”charset=”utf-8″></s…

    2022年7月23日
    9
  • swagger常用注解[通俗易懂]

    一、swagger常用注解1、与模型相关的注解两个注解:@ApiModel:用在模型类上,对模型类做注释;@ApiModelProperty:用在属性上,对属性做注释2、与接口相关的注解六个注解:@Api:用在controller上,对controller进行注释;@ApiOperation:用在API方法上,对该API做注释,说明API的作用;

    2022年4月14日
    53
  • Docker 导出/导入镜像[通俗易懂]

    Docker 导出/导入镜像[通俗易懂]如果服务器网络不好或者pull不下来镜像,只能在其它网络比较好的机器上pull下来镜像,导出成一个文件,再下载上传到网络不好的机器上,然后再从文件中导出来,这样在网络不好的机器上也能使用docker镜像了。1、导出镜像首先使用dockerimages查看本机镜像,找到他的镜像id,如图所示:然后执行以下命令通过镜像id导出镜像到宿主机$dockersav…

    2025年9月21日
    8
  • ViewStub使用[通俗易懂]

    ViewStub使用[通俗易懂]一、ViewStub是什么?<ViewStub>标签实质上是一个宽高都为0的不可见的轻量级View。通过延迟按需加载布局的方式提升页面加载速度。二、ViewStub使用场景某布局默认是不可见,当满足特定场景才显示。比如网络异常提示、引导页等。三、ViewStub怎么使用?1、创建布局文件layout_test.xml(注:根标签可以是布局或控件,但不能为<merge>,子标签可以使用<merge>)<TextView…

    2022年6月28日
    30
  • Python 第三方模块 科学计算 SciPy模块1 简介,常数,IO「建议收藏」

    Python 第三方模块 科学计算 SciPy模块1 简介,常数,IO「建议收藏」一.介绍1.介绍:SciPy是1个Python开源库,在BSD授权下发布,主要用于数学/科学/工程计算.SciPy依赖于NumPy来提供方便快速的n维数组操作.组合使用NumPy+SciPy+Matplotlib可以在很大程度上替代MATLAB,并且功能更强大,编程更容易…

    2022年6月28日
    29

发表回复

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

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