cpythonjavagolang_cpython:列表对象(PyListObject)的扩容机制

list object

可变对象头

ob_item: 指向分配的空间,元素是指针

allocated: 真实容量.

Objects/listobjects.c

/* Ensure ob_item has room for at least newsize elements, and set

* ob_size to newsize. If newsize > ob_size on entry, the content

* of the new slots at exit is undefined heap trash; it's the caller's

* responsibility to overwrite them with sane values.

* The number of allocated elements may grow, shrink, or stay the same.

* Failure is impossible if newsize <= self.allocated on entry, although

* that partly relies on an assumption that the system realloc() never

* fails when passed a number of bytes <= the number of bytes last

* allocated (the C standard doesn't guarantee this, but it's hard to

* imagine a realloc implementation where it wouldn't be true).

* Note that self->ob_item may change, and even if newsize is less

* than ob_size on entry.

*/

static int

list_resize(PyListObject *self, Py_ssize_t newsize)

{

PyObject **items;

size_t new_allocated, num_allocated_bytes;

Py_ssize_t allocated = self->allocated;

/* Bypass realloc() when a previous overallocation is large enough

to accommodate the newsize. If the newsize falls lower than half

the allocated size, then proceed with the realloc() to shrink the list.

*/

if (allocated >= newsize && newsize >= (allocated >> 1)) {

assert(self->ob_item != NULL || newsize == 0);

Py_SET_SIZE(self, newsize);

return 0;

}

/* This over-allocates proportional to the list size, making room

* for additional growth. The over-allocation is mild, but is

* enough to give linear-time amortized behavior over a long

* sequence of appends() in the presence of a poorly-performing

* system realloc().

* Add padding to make the allocated size multiple of 4.

* The growth pattern is: 0, 4, 8, 16, 24, 32, 40, 52, 64, 76, ...

* Note: new_allocated won't overflow because the largest possible value

* is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t.

*/

new_allocated = ((size_t)newsize + (newsize >> 3) + 6) & ~(size_t)3;

/* Do not overallocate if the new size is closer to overallocated size

* than to the old size.

*/

if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize))

new_allocated = ((size_t)newsize + 3) & ~(size_t)3;

if (newsize == 0)

new_allocated = 0;

num_allocated_bytes = new_allocated * sizeof(PyObject *);

items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes);

if (items == NULL) {

PyErr_NoMemory();

return -1;

}

self->ob_item = items;

Py_SET_SIZE(self, newsize);

self->allocated = new_allocated;

return 0;

}

list resize

import sys

def print_list_size(nums=None):

nums_size = sys.getsizeof(nums)

if nums:

print(f"id({id(nums)}) v:{nums[-1]} len:{len(nums)} size:{nums_size}")

else:

print(f"id({id(nums)}) v:{nums} len:{len(nums)} size:{nums_size}")

def test_0_4():

data = []

print_list_size(nums=data)

for i in range(1, 35):

data.append(i)

print_list_size(nums=data)

test_0_4()

def resize_list(x):

return (x + (x >> 3) + 6) & (~3)

"""

## 3.9

Add padding to make the allocated size multiple of 4

The growth pattern is: 0, 4, 8, 16, 24, 32, 40, 52, 64, 76

https://github.com/python/cpython/blob/3.9/Objects/listobject.c

new_allocated = ((size_t)newsize + (newsize >> 3) + 6) & ~(size_t)3;

id(4554271168) v:[] len:0 size:56

id(4554271168) v:1 len:1 size:88

id(4554271168) v:2 len:2 size:88

id(4554271168) v:3 len:3 size:88

id(4554271168) v:4 len:4 size:88

id(4554271168) v:5 len:5 size:120

id(4554271168) v:6 len:6 size:120

id(4554271168) v:7 len:7 size:120

id(4554271168) v:8 len:8 size:120

id(4554271168) v:9 len:9 size:184

id(4554271168) v:10 len:10 size:184

id(4554271168) v:11 len:11 size:184

id(4554271168) v:12 len:12 size:184

id(4554271168) v:13 len:13 size:184

id(4554271168) v:14 len:14 size:184

id(4554271168) v:15 len:15 size:184

id(4554271168) v:16 len:16 size:184

id(4554271168) v:17 len:17 size:248

id(4554271168) v:18 len:18 size:248

id(4554271168) v:19 len:19 size:248

id(4539054528) v:20 len:20 size:248

id(4539054528) v:21 len:21 size:248

id(4539054528) v:22 len:22 size:248

id(4539054528) v:23 len:23 size:248

id(4539054528) v:24 len:24 size:248

id(4506298816) v:25 len:25 size:312

id(4506298816) v:26 len:26 size:312

id(4506298816) v:27 len:27 size:312

id(4506298816) v:28 len:28 size:312

id(4506298816) v:29 len:29 size:312

id(4506298816) v:30 len:30 size:312

id(4506298816) v:31 len:31 size:312

id(4506298816) v:32 len:32 size:312

id(4506298816) v:33 len:33 size:376

id(4506298816) v:34 len:34 size:376

## 3.7/3.8

The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88

https://github.com/python/cpython/blob/3.7/Objects/listobject.c

https://github.com/python/cpython/blob/3.8/Objects/listobject.c

new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6);

(py3) ➜ stu git:(hyh_debug_01_main) ✗ python --version

Python 3.7.4

(py3) ➜ stu git:(hyh_debug_01_main) ✗ python test_list_resize.py

id(4538606048) v:[] len:0 size:72

id(4538606048) v:1 len:1 size:104

id(4538606048) v:2 len:2 size:104

id(4538606048) v:3 len:3 size:104

id(4538606048) v:4 len:4 size:104 4个空间使用完. 增加4

id(4538606048) v:5 len:5 size:136

id(4538606048) v:6 len:6 size:136

id(4538606048) v:7 len:7 size:136

id(4538606048) v:8 len:8 size:136 8个空间使用完. 增加4

id(4538606048) v:9 len:9 size:200

id(4538606048) v:10 len:10 size:200

id(4538606048) v:11 len:11 size:200

id(4538606048) v:12 len:12 size:200

id(4538606048) v:13 len:13 size:200

id(4538606048) v:14 len:14 size:200

id(4538606048) v:15 len:15 size:200

id(4538606048) v:16 len:16 size:200 16个空间使用完. 增加8

id(4538606048) v:17 len:17 size:272

id(4538606048) v:18 len:18 size:272

id(4538606048) v:19 len:19 size:272

id(4538606048) v:20 len:20 size:272

id(4538606048) v:21 len:21 size:272

id(4538606048) v:22 len:22 size:272

id(4538606048) v:23 len:23 size:272

id(4538606048) v:24 len:24 size:272

id(4538606048) v:25 len:25 size:272 25个空间使用完. 增加9

id(4538606048) v:26 len:26 size:352

id(4538606048) v:27 len:27 size:352

id(4538606048) v:28 len:28 size:352

id(4538606048) v:29 len:29 size:352

id(4538606048) v:30 len:30 size:352

id(4538606048) v:31 len:31 size:352

id(4538606048) v:32 len:32 size:352

id(4538606048) v:33 len:33 size:352

id(4538606048) v:34 len:34 size:352

# 关于size不一致问题,_typeobject 类型对象结构体在py3.9中删除了部分元素比3.8更小

"""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】 国家开放大学2020年春季 2716动物营养基础 参考试题

试卷代号&#xff1a;2721 座位号 2 0 2 0年春季学期期末统一考试 乡镇行政管理试题 2020年7月 一、单项选择题&#xff08;每小题1分&#xff0c;共10分&#xff0c;每小题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1&#xff0e; 1926年出版了世…

开关量光端机产品特点及应用范围介绍

飞畅科技生产的开关量光端机为纯开关量(告警量)光端机提供1-7路开关量在光纤中传输&#xff0c;该产品解决了电磁干扰、地环干扰和雷电破坏的难题&#xff0c;提高了数据通讯的可靠性、安全性和保密性&#xff0c;可广泛用于各种工业控制、过程控制和交通控制等场合&#xff0c…

【渝粤教育】 国家开放大学2020年春季 2773特种动物养殖 参考试题

试卷代号&#xff1a;2779 座位号 2 0 2 0年春季学期期末统一考试 植物病虫害防治基础 试题 2020年7月 一、单项选择题&#xff08;每小题3分&#xff0c;共60分&#xff09; 1&#xff0e;非传染性病害与传染性病害诊断程序的不同在于( )。 A&#xff0e;田间观察 B&#xff0…

计算机网络系统什么组成,计算机网络系统是由什么组成的

计算机网络系统是由网络硬件和网络软件组成的。在网络系统中&#xff0c;硬件的选择对网络起着决定的作用&#xff0c;而网络软件则是挖掘网络潜力的工具。一般是指极端机设备、传输介质、和网络连接设备。至2011年&#xff0c;网络连接设备有很多&#xff0c;功能不一&#xf…

ds1302典型应用原理图_不同类型的光纤激光器,在工业中有哪些典型应用

激光器根据材料分类可分为光纤激光器、半导体激光器、固体激光器与C02激光器等。而在整个激光器的工业应用中&#xff0c;光纤激光器独树一帜&#xff0c;近几年发展速度最快。目前光纤激光器的种类越来越多&#xff0c;根据激光输出时域特性的不同&#xff0c;可以将光纤激光器…

【渝粤教育】 国家开放大学2020年春季 3962金融营销基础 参考试题

试卷代号&#xff1a;3983 座位号口口 2 0 2 0年春季学期期末统一考试 品牌管理 试题 2020年7月 一、单项选择题&#xff08;在各题的备选答案中&#xff0c;只有1项是正确的&#xff0c;请将正确答案的序号填写在题中的括号内&#xff0c;每个小题2分&#xff0c;共20分&#…

webapp文本编辑器_Project Student:维护Webapp(可编辑)

webapp文本编辑器这是Project Student的一部分。 其他职位包括带有Jersey的 Web服务 客户端&#xff0c;带有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 带有Spring数据的持久性 &#xff0c;分片集成测试数据 &#xff0c; Webservice集成 &#xff0c; JPA标准…

交换机的端口结构及端口类型

交换机在同一时刻可进行多个端口对之间的数据传输。每一端口都可视为独立的物理网段&#xff08;注&#xff1a;非IP网段&#xff09;&#xff0c;连接在其上的网络设备独自享有全部的带宽&#xff0c;无须同其他设备竞争使用。那么&#xff0c;你对于交换机的端口结构及端口类…

【渝粤教育】国家开放大学2018年春季 0025-22T数据结构 参考试题

编号&#xff1a;0025 座位号&#xff1a; 17-18学年第1学期期末考试 数据结构 试题 一、选择题&#xff1a;&#xff08;每题2分&#xff0c;共20分&#xff09; 1&#xff0e;在一个单链表中&#xff0c;若要向指针p指向的结点之后插入一个由指针q指向的结点&#xff0c;则…

qt 加载rtsp流_qt_ffmpeg_rtsp 在QT中拉取RTSP视频流并用FFMPEG解码播放 - 下载 - 搜珍网...

压缩包 : d078f445f64e4d494b78433595b8954d.zip 列表FFmpeg-QT-rtsp/FFmpeg-QT-rtsp/README.mdFFmpeg-QT-rtsp/VideoPlayer_2.proFFmpeg-QT-rtsp/bin/FFmpeg-QT-rtsp/bin/VideoPlayer_2.exeFFmpeg-QT-rtsp/bin/avcodec-58.dllFFmpeg-QT-rtsp/bin/avdevice-58.dllFFmpeg-QT-rts…

表示微型计算机系统稳定性,计算机基础知识(三)135

135、微型计算机的运算器、控制器和内存存器的总称是()A 主机B MPUC ALUD CPU136、在微型计算机中&#xff0c;控制器的基本功能是()A 存储各种控制信息B 保持各种控制状态C 实现算数运算和逻辑运算D 控制机器各个部件协调一致工作137、硬盘与软盘相比()A 硬盘容量小B 硬盘旋转…

【渝粤教育】国家开放大学2018年春季 0077-21T古代汉语专题 参考试题

试卷编号&#xff1a;0077 2017—2018学年度第二学期期末考试 古代汉语专题试题 2018年7月 一、名词解释&#xff08;每小题5分&#xff0c;共20分&#xff09; 1&#xff0e;图画文字2&#xff0e;意动动词3&#xff0e;反切注音 4&#xff0e;区别字 1. 朋 2. 宁 3. 监…

交换机用光纤模块互连一端灯不亮或两端都不亮,如何处理?

交换机用光纤模块互连一端灯不亮或两端都不亮如何处理&#xff0c;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 1、使用dis int 相应的接口确认此模块已经被正确的识别&#xff1b; 2、确认两端设备光模块的物理参数是否一致&#xff0c;如波长、速率、距…

Java 12:使用开关表达式进行映射

在本文中&#xff0c;我们将研究Java 12的新功能“ Switch Expressions”&#xff0c;以及如何与Java 12结合使用。 Stream::map操作和其他一些Stream操作。 了解如何使用流和开关表达式使代码更好。 切换表达式 Java 12附带了对“开关表达式”的“预览”支持。 Switch Expre…

openmv串口发送数据_关于arduino和openmv串口通信的问题

#openmv的代码import sensor, image, timeimport jsonfrom pyb import UART# For color tracking to work really well you should ideally be in a very, very,# very, controlled enviroment where the lighting is constant...blue_threshold ( 0, 60, -20, 64, -128, 0)…

【渝粤教育】国家开放大学2018年春季 0175-21T社会调查研究与方法 参考试题

科目编号&#xff1a;0175 座位号 2017-2018学年度第二学期期末考试 社会调查研究与方法 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题框中★&…

主流微型计算机,主流微型计算机硬件系统维护

主流微型计算机硬件系统维护通过其芯片技术的革新来缩短存取时间和提高内存访问周期效率的。FP打兰快页模式与EDO打兰占据原PC内存条的大部分市场&#xff0c;但随着电脑进入奔腾时代,SDRAM已作为内存条最新技术要求取代了前两者在新型号电脑上的位置。SDRAM即同步打兰也…

【渝粤教育】国家开放大学2018年春季 0257-22T高级英语听力(1) 参考试题

试卷代码&#xff1a;0257 2017-2018学年度第二学期期末考试 高级英语听力&#xff08;1&#xff09;试题 2018年7月 注 意 事 项 一、将你的准考证号、学生证号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸规定栏内。 考试结束后&#xff0c;把试卷和答题纸放…

什么叫POE交换机?POE交换机使用方法介绍?

供电用的交换机&#xff0c;比如安装网络监控时不方便给摄像头拉电线&#xff0c;就可以使用PoE交换机供电&#xff0c;还有弄无线网络时也可以给AP供电&#xff0c;主要方便&#xff0c;关于怎么使用&#xff0c;如果那些需要供电的设备支持PoE直接连接就行了。那么&#xff0…

【渝粤教育】国家开放大学2018年春季 0359-22T会计学原理 参考试题

科目编号&#xff1a;0359 座位号 2017-2018学年第二学期期末考试 基础会计试题 2018 年7月一、单项选择题&#xff1a;请将正确答案填在下面的表格内 &#xff08;每小题2分&#xff0c;共30分&#xff09; 1.企业法定盈余公积金的计算依据是&#xff08; &#xff09;。 A.…