python 列表, 元组内存分配优化

1. 空元组与空列表

>>> a = ()

>>> b = ()

>>> a is b

True

>>> id(a)

4374097992

>>> id(b)

4374097992

>>> a = []

>>> b = []

>>> a is b

False

元组是不可变对象,空元组只存在一个,实在是没有必要每次都创建出一个空元组来,列表则不同,列表是可变对象,每次都会创建出一个新的空列表

2. 小元组的分配优化

为了减少内存碎片,加快分配速度,python会重用旧的元组,如果一个元组不再被使用且元组的长度小于20,那么python不会直接释放它,而是将它移动到一个列表中,这个列表被分为20组,每一组存储一系列长度在0到20之间的元组,每个组可以最多存储2000个元组。第一组只存储了一个元组,正是空元组。

>>> a = (1, 2, 3)

>>> id(a)

4377330024

>>> del a

>>> b = (1, 2, 4)

>>> id(b)

4377330024

元组a被del后,内存并不是真的被回收,它的这片内存空间可以被b直接使用,强调一点,元组的长度必须和a相同,这样才能重用这片内存。

3. 列表大小调整

python里的列表和C++中的vector很像,看似有无限的空间可以使用,但其实,他们总是预先分配一些容量,当存储的数据超过容量时,则采取一定的算法增加容量,这样做可以避免过于频繁的申请内存,又能保证插入效率。

python容量增长的方式为

0、4、8、16、25、35、46、58、72、88,...

在不阅读源码的情况,我们可以通过简单的手段来验证这一说法

>>> a = []

>>> import sys

>>> sys.getsizeof(a)

64

>>> a.append(1)

>>> sys.getsizeof(a)

96

>>> a.append(2)

>>> sys.getsizeof(a)

96

>>> a.append(3)

>>> sys.getsizeof(a)

96

>>> a.append(4)

>>> sys.getsizeof(a)

96

>>> a.append(5)

>>> sys.getsizeof(a)

128

一个空的列表占用64字节,向列表里写入一个元素后,整个列表占用的内存增加了32个字节,我们可以推测,这个时候增加了4个插槽的容量,每个插槽占用8个字节的大小。

继续向列表里新增元素,发现列表的大小竟然不发生变化了,直到写入第5个元素后,再一次超出了现有的容量,列表再次扩容,变为8,又增加了32个字节的内存,最终列表占用内存的大小为128。

下面的代码计算出列表增长过程中内存的变化

import sys

from matplotlib import pyplot as plt

from matplotlib import font_manager

size = 100

length = []

memory = []

l = []

for counter in range(size):

l.append(counter)

length.append(len(l))

memory.append(sys.getsizeof(l))

my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")

plt.plot(length, memory)

plt.title("python列表长度与内存增长关系", fontproperties=my_font)

plt.xlabel("列表长度", fontproperties=my_font)

plt.ylabel("内存", fontproperties=my_font)

plt.savefig('list_memory.png')

生成的曲线图如下

python列表内存分配_python 列表, 元组内存分配优化相关推荐

  1. python处理列表中字典_Python 列表、元组、字典及集合操作详解

    一.列表 列表是Python中最基本的数据结构,是最常用的Python数据类型,列表的数据项不需要具有相同的类型 列表是一种有序的集合,可以随时添加和删除其中的元素 列表的索引从0开始 1.创建列表 ...

  2. python元组和列表的联系_Python 列表和元组

    1.数据结构:通过某种方式组织在一起的数据元素的集合 2.在Python中,最基本的数据结构是序列(sequence),最后一个元素标记为-1,倒数第二个元素为-2,第一个元素位于最开始,索引为0 3 ...

  3. python列表求平均数_python 列表平均值

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我有一个列表:类似: data = , , , ] 我想把这个算出来... 我想 ...

  4. python列表比较方法_python列表常用方法

    list是一个类,用中括号括上,逗号分隔,元素可以是数字,字符,字符串,也可以是嵌套列表,布尔类型. 1.通过索引取值 li=[1,12,9,'age',['wangtianning',[19,'10 ...

  5. python list方法操作_Python 列表(List)操作方法详解

    参考文献来源于脚本之家 列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型.列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0 ...

  6. python列表生成器语法_Python 列表生成式\生成器

    Python 列表生成式+生成器 一.列表生成式 1.什么是列表生成器 一种可以便捷地生成列表的表达式,有时候可以替换list.append(变量) 2.需求. 如何将列表中的每个数据都加1 列表:d ...

  7. python列表的操作方法_Python 列表(List)操作方法-经管之家官网!

    本文主要介绍了Python中列表(List)的详解操作方法,包含创建.访问.更新.删除.其它操作等, 下列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有 ...

  8. python列表字典操作_Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  9. python列表浅复制_Python列表深浅复制详解

    转自:https://www.cnblogs.com/blaomao/p/7239203.html 在文章<Python 数据类型>里边介绍了列表的用法,其中列表有个 copy() 方法, ...

  10. python一些简单操作_python列表的基本操作有哪些

    python列表的基本操作有:1.创建列表,只要把逗号分隔的不同的数据项使用方括号括起来:2.添加新的元素:3.遍历列表:4.访问列表中的值:5.从list删除元素. 相关免费学习推荐:python教 ...

最新文章

  1. mysql存储过程参数可选,如何在T-SQL存储过程中使用可选参数?
  2. 一致性哈希(Consistent Hashing)
  3. C语言 · 征税程序
  4. 北大美女学霸力压大神何恺明新作MAE!怒摘12个SOTA,灵感竟来自16年前CVPR论文...
  5. 挑战《IT我最大》 Windows 7由你秀 活动的丑恶行径
  6. MDX 中的重要概念 (MDX)
  7. MySQL重温笔记-索引
  8. 速卖通新手入驻必须了解的“9大知识点”
  9. IDA*-洛谷P1379 八数码难题
  10. nodejs-url网址解析的好帮手
  11. cad批量偏移_学会这12个CAD制图命令,走遍天下都不怕,有没有兴趣?
  12. restful api接口设计
  13. 面试题,你是如何评判产品改版后的效果的?
  14. 优化MySQL,还是使用缓存?
  15. execjs执行js出现window对象未定义时的解决_JS逆向 | 助力新手 , 两个JS逆向喂饭教程...
  16. 用LinkedList模拟栈(Java容器)
  17. 26. Magento 常用(1)
  18. ZigBee技术有哪些应用领域?
  19. google手机连接Wifi后总会提示无法连接互联网问题的解决
  20. 计算机专业试讲10分钟教案,幼儿园10分钟试讲教案

热门文章

  1. 一个字等于多少个字节?
  2. js怎么获取扫码枪条码_如何使用JavaScript获取扫码枪扫描得到的条形码
  3. python gdal 读取图层及EPSG
  4. 【WhatsApp营销】如何设置欢迎消息?WhatsAppBusiness问候语示例
  5. 证券交易系统术语介绍
  6. 计算机网络1MB等于多少b,1mb等于多少kb流量?1mb等于多少GB?1mb等于多少TB?1mb等于多少b...
  7. 吴恩达机器学习(四)代价函数
  8. AVC、HEVC、VVC帧间预测技术
  9. 【程序员日记】快乐的一周嘛(第8期)(财富、快乐、技术)
  10. NXP JN5169 电源管理和睡眠模式