首页 > 编程语言 >Python - list VS tuple, list() VS []

Python - list VS tuple, list() VS []

时间:2023-07-14 17:47:51浏览次数:30  
标签:__ .__ Python list 列表 tup VS sizeof

差异一:list可变 vs tuple不可变

列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。

而元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。

# Jupyter格式

tup = (1, 2, 3, 4)
new_tup = tup + (5, ) # 创建新的元组new_tup,并依次填充原元组的值
new_tup
(1, 2, 3, 4, 5)

l = [1, 2, 3, 4]
l.append(5) # 添加元素5到原列表的末尾
l
[1, 2, 3, 4, 5]

 

差异二:存储方式的差异

2.1 初始化相同个数的元素,存储空间就有差异

对列表和元组,我们放置了相同的元素,但是元组的存储空间,却比列表要少 16 字节。

l = [1, 2, 3]
l.__sizeof__()
64

tup = (1, 2, 3)
tup.__sizeof__()
48

原因是:

由于列表是动态的,所以它需要存储指针,来指向对应的元素(上述例子中,对于 int 型,8 字节)。另外,由于列表可变,所以需要额外存储已经分配的长度大小(8 字节),这样才可以实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间。

 

2.2 增加/删减操作时,list存储空间存在over-allocating

列表空间分配的过程。我们可以看到,为了减小每次增加 / 删减操作时空间分配的开销,Python 每次分配空间时都会额外多分配一些。

这样的机制(over-allocating)保证了其操作的高效性:增加 / 删除的时间复杂度均为 O(1)。

l = []
l.__sizeof__() // 空列表的存储空间为40字节
40
l.append(1)
l.__sizeof__() 
72 // 加入了元素1之后,列表为其分配了可以存储4个元素的空间 (72 - 40)/8 = 4
l.append(2) 
l.__sizeof__()
72 // 由于之前分配了空间,所以加入元素2,列表空间不变
l.append(3)
l.__sizeof__() 
72 // 同上
l.append(4)
l.__sizeof__() 
72 // 同上
l.append(5)
l.__sizeof__() 
104 // 加入元素5之后,列表的空间不足,所以又额外分配了可以存储4个元素的空间

 

差异三:性能差异

 元组要比列表更加轻量级一些,所以总体上来说,元组的性能速度要略优于列表。

 

 

补充:list() vs []

想创建一个空的列表,我们可以用下面的 A、B 两种方式,请问它们在效率上有什么区别吗?我们应该优先考虑使用哪种呢?

  • 区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,
  • 反观[]是一个内置的C函数,可以直接被调用,因此效率高。
# 创建空列表
# option A
empty_list = list()

# option B
empty_list = []

 

标签:__,.__,Python,list,列表,tup,VS,sizeof
From: https://www.cnblogs.com/frankcui/p/17554596.html

相关文章

  • python编写按键精灵
    环境:python3.9  功能:网页版的腾讯企业邮箱删除邮件安装依赖:pipinstall pyautoguiimportpyautoguiimporttimeforiinrange(3):print(i)print('选择页面')time.sleep(3)pyautogui.dragTo(215,251,duration=1)#按绝对位置拖动鼠标到选择所有......
  • [oeasy]python0072_整数类型_int_integer_整型变量
    帮助手册回忆上次内容 上次了解的是字符串字符串就是字符的串字符串长度可以用len函数字符可以用下标索引[] 可以用str将整型数字转化为字符串 字符的长度本身有长有短ascii字符集包括各种转义字符都对应1个字节......
  • python踩坑: 装饰器类的局部缓冲值
    test.py:#coding:utf8importtimeimportthreadingimportfunctoolsclassMyThread(threading.Thread):def__init__(self,filename,fps):self.filename=filenameself.fps=fpssuper().__init__()defrun(self):......
  • python 时间
    目录时间Python日期和时间python中时间日期格式化符号:获取某月日历Time模块日历(Calendar)模块其他相关模块和函数时间Python日期和时间#Python程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。#Python提供了一个time和calendar模块可以用于格式化日期......
  • python 推导式
    目录python推导式列表推导式字典推导式集合推导式python推导式列表推导式#!/usr/bin/envpython#-*-coding:utf-8-*-#BY:wenchao.Litime:2021/7/12#列表推导式格式:[表达式for变量in旧列表]或者[表达式for变量in旧列表if条件]#旧列表》》新列表......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-7-浏览器的相关操作
    1.简介上一篇已经将playwright的元素定位大法基本介绍的差不多了,但是在Web的UI自动化的测试中,我们通常需要使用一些方法来操作浏览器,今天就跟随学习了解一下。这一篇宏哥主要是介绍一下,在自动化测试的时候,我们常见的一些浏览器操作有哪些,宏哥将会一一介绍和讲解。2.层级在介绍......
  • centos7.8安装Python-3.10
    centos7.8安装Python-3.10一.安装opensslpython3.10需要openssl至少1.1.1,而centos7.8默认版本为1.0.2*参考:https://www.cnblogs.com/linagcheng/p/15870060.html 二.安装依赖yuminstall-ybzip2-devellibffi-develzlibzlib-devel 三.安装Python-3.10tar-zx......
  • Python如何实现自动生成报表并以邮件发送
    Python如何实现自动生成报表并以邮件发送首先来介绍下实现自动报表要使用到的Python库:pymysql一个可以连接MySQL实例并且实现增删改查功能的库datetimePython标准库中自带的关于时间的库openpyxl一个可以读写07版以后的Excel文档(.xlsx格式也支持)的库smtplibSMTP即简单......
  • python之数据库:SQL注入问题,视图,触发器,事务,存储过程,函数,流程控制,索引,慢查询
    SQL注入问题(了解现象)importpymysql#连接MySQL服务端conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='db8_3',charset='utf8',autocommit=True#......
  • python中import和import...from的区别
    今天遇到一个奇怪的问题,如下面的代码:importtkinterastkfromtkinterimportsimpledialogdefpopup():user_input=tk.simpledialog.askstring("输入对话框","请输入你的名字:")ifuser_inputisnotNone:print("你的名字是:",user_input)......