python中的列表和元组_浅析Python中的列表和元组
区别列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数)。
元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。
元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去 分配内存。
这些区别揭示了两者在设计哲学上的不同:元组用于描述一个不会改变的事物的多个属性,而列表可被用于保存多个互相独立对象的数据集合。
动态数组--列表
列表可以改变大小及内容不同,列表的可变性的代价在于存储它们需要额外的内存以及使用它们需要额外的计算。我们在浅析Python中列表操作之*和*=中一起研究了cpython的list对象的源码,看到了list对象的动态分配数组的大体过程(调用resize函数),而且在动态调整数组大小时使用如下的分配公式:
new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6);
下图是一个列表多次添加元素时分配空间的变化示意图:
静态数组--元组
元组的不可改变性使其成为了一个非常轻量级的数据结构。这意味着存储元组不需要很多的内存开销,而且对元组的操作也非常直观。一旦元组被创建,它的内容无法被修改或它的大小也无法被改变。虽然它们不支持改变大小,但是我们可以将两个元组合并成一个新元组。这一操作类似列表的resize操作,但我们不需要为新生成的元组分配任何额外的空间。任意两个元组相加或者元组乘以一个整数进行repeat始终返回一个新分配的元组。其中两个元组相加调用cpython中的tupleconcat方法,而乘法操作调用的是tuplerepeat方法。上述两个方法的实现如下:
static PyObject *
tupleconcat(PyTupleObject *a, PyObject *bb)
{
...
size = Py_SIZE(a) + Py_SIZE(b);
np = tuple_alloc(size);
...
return (PyObject *)np;
}
static PyObject *
tuplerepeat(PyTupleObject *a, Py_ssize_t n)
{
...
size = Py_SIZE(a) * n;
np = tuple_alloc(size);
...
return (PyObject *) np;
}
元组的静态特性的另一个好处体现在一些会在Python后台发生的事:资源缓存。Python是一门垃圾收集语言,这意味着当一个变量不再被使用时,Python会将该变量使用的内存释放回操作系统,以供其他程序(或变量)使用。然而,从源码中可以看到,对于长度为1~20的元组,即使它们不再被使用,它们的空间也不会立刻被还给系统,而是留待未来使用。这意味着当未来需要一个同样大小的新元组时,我们不再需要向操作系统申请一块内存来存放数据,因为我们已经有了预留的内存。
我们可以验证资源缓存这一点,可以看到初始化一个列表消耗的时间是初始化一个元组消耗时间的6倍!可以想象一下,某些场景中在一个循环中频繁创建列表,耗时还是非常可观的,此时可以考虑使用元组来提高执行效率。
参考阅读:浅析Python中列表操作之*和*=mp.weixin.qq.com
最后欢迎关注个人公众号CodeWorksCodeWorks
python中的列表和元组_浅析Python中的列表和元组相关推荐
- python中map函数字典映射_浅析python中的map函数
1.map()函数的简介以及语法: map是python内置函数,会根据提供的函数对指定的序列做映射. map()函数的格式是:map(function,iterable,...) 第一个参数接受一个 ...
- python中大括号是什么意思_浅析python 中大括号中括号小括号的区分
python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...
- python和pycharm之间的关系_浅析python,PyCharm,Anaconda三者之间的关系
一.它们是什么? 1.python Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C,Java,C++等,一种编程语言. 2.Anaconda Anaconda指的是一 ...
- python条件控制语句要注意什么_浅析Python 条件控制语句
Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: 代码执行过程: if 语句 Python中if语句的 ...
- java中随机数怎么定义类_浅析Java中的随机数类
Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...
- java js中 function函数报错_浅析JS中对函数function的理解(基础篇)
正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...
- 中service层的作用_浅析Java中dto、dao、service、controller的四层结构
目前我所在的项目组采用的是SpringBoot框架,前端使用BootStrap+jQuery. SpringBoot是BS开发框架之一,不用单独开启tomcat服务器,目前比较流行,一般开发大型项目时 ...
- java中拼接和 的区别_浅析Java中String与StringBuffer拼接的区别
学习笔记: 1.String拼接会创建一个新的String对象,存储拼接后的字符串: StringBuffer拼接是直接在本身拼接,会即时刷新. 2.String只能拼接String类型的字符串: S ...
- python二维列表转字典_在Python中字符串、列表、元组、字典之间的相互转换
一.字符串(str) 字符串转换为列表 使用list()方法 str_1 = "1235" str_2 = 'zhangsan' str_3 = '''lisi''' tuple_ ...
最新文章
- 0428(字典,列表,循环)
- Jmeter使用基础笔记-写一个http请求
- php内核总结_深入理解PHP内核(一)
- qt调用import sys库_Python模块之 sys 模块
- 挖掘城市ip_抖in杭州嘉年华,原来城市营销还能这么玩!
- 蓝桥杯 ALGO-111 算法训练 明明的随机数
- jdk Arrays类
- 虚拟机与ubuntu(二):连接访问
- 博弈论基础知识与SG函数
- Lunar Pro for Mac v5.2.2 – 实用的外接显示器屏幕亮度调节工具
- Local-DPP论文阅读笔记
- SQL2008R2数据库安装教程
- RFC822邮件格式
- 论文复现_芯片定位和引脚缺陷检测
- 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 matlab程序(二)
- go实现 LeetCode 1227 飞机座位分配概率
- 2021免费大容量OneDrive + office 365桌面版 (a1 a1p)
- Android 上的SSH软件 connectbot
- 相机标定(三)——手眼标定
- 【FME】模板模块化组织思路
热门文章
- 在才开始进入前端这个坑的时候 在布局中会遇到很多问题 我才入这个坑的时候 在margin top 中遇到几个bug 我分享一下...
- ‘分享到’侧边栏制作
- Java类、实例的初始化顺序
- SqlBulkCopy导入大数据
- javascript的prototype继承问题
- 用SQL中的isnull函数注意了
- springmvc默认方法名为映射名_SpringIoC和SpringMVC的快速入门
- 从零开始学前端:定位 --- 今天你学习了吗?(CSS:Day17)
- java 获取自绘窗口_iPhone中自绘实现步骤
- Python+django网页设计入门(10):分页显示