首页 > 编程语言 >python - 列表(list)

python - 列表(list)

时间:2024-12-02 10:47:07浏览次数:5  
标签:扩容 python list 元组 数组 列表 长度 li

创建一个列表时,系统会分配一定的空间,当新增元素个数超出这个空间时,会自动进行扩容。

这个结论很容易找到,我们可以写一段代码证明一下,内存占用是阶段变化的。

from sys import getsizeof

li = []
for i in range(64):
    li.append(i)
    print(f'length: {len(li)}, size: {getsizeof(li)}, id: {id(li)}')

# getsizeof() 用于获取一个对象在内存中所占的字节数(不包含引用)

print('hello world!!')

列表不是基于链表的,不过很明显,数组无法扩容,因此需要一套逻辑,才能既使用数组又支持扩容。

我们可以想到两种扩容方案:

  1. 列表内部封装了多个数组,扩容的时候,直接增加一个新的数组,比如:长度为 23 的 list,由 3 个长度为 8 的小数组拼接而成;
  2. 列表内部只封装了一个数组,扩容的时候,声明一个更大的数组,将历史数据,复制到新的数组中。

第 2 个方案正确。(第一种方案,需要大量数据,才会提高性能)

可能会产生一个疑问,为什么内存地址(id)会是固定的?不是说数据从一个数组复制到了另一个?

因为 python 中本来就没有数组类型,这个内存地址不是数组的地址,列表也是一种封装后的数据结构。

元组和列表的性能问题

两者都是基于数组的,存取数据的性能上,差别估计不会太大;

从原理上看,列表有初始容量问题,比如:长度为 5、7、9 这样的列表,会预留一部分闲置的空间,初始化阶段,列表必定更加耗时;

获取数组长度的时候,元组可以直接调用 array.length,而列表至少需要一个变量,用于存储当前的数组长度;

当列表和元组内容完全一致,并且,列表刚好用完所有空间的情况下,列表占用的空间仍然会略微大于元组;

因此,元组的性能理论上会高于列表。

可以看看其他人的实验结果:https://zhuanlan.zhihu.com/p/352092425

标签:扩容,python,list,元组,数组,列表,长度,li
From: https://www.cnblogs.com/chenss15060100790/p/18581191

相关文章

  • python - 字典(dict)
    字典(dict):基于哈希表的一种数据结构,从原理上来说,与其它语言中的map是同一类东西。#创建一个空字典importjsonordered_dict={'a':1}print(ordered_dict)#向字典中添加一些键值对ordered_dict['b']=2ordered_dict['c']=3ordered_dict['d']=4print(ordered......
  • Python_smtp 邮件交互
    SMTP协议简介SMTP(SimpleMailTransferProtocol)是一种用于发送电子邮件的协议。它定义了邮件传输的标准和规则,使得不同邮件服务器之间能够互相通信并传递邮件。发送邮件的基本步骤建立连接:使用smtplib.SMTP_SSL或smtplib.SMTP建立与邮件服务器的安全连接。通常,使用......
  • python - threadlocal
    功能:给线程创建一些变量,线程彼此之间是完全隔离的,每个线程使用各自的线程。使用场景:在处理数据库事务过程中,业务开始时,获取连接,业务结束时,关闭连接,中间的业务是未知的。想封装这样的代码,就可以用threadlocal。importthreading#创建threading.local的实例local=threa......
  • python - 修饰函数
    Python装饰器(Decorator),名字叫装饰器,功能自然对应于设计模式中的装饰者模式(代理模式)。写法上,很像java中的函数注解,实际上,功能也大致一样。简单说:就是在调用函数的时候,可以在在调用之前,加一点逻辑,调用完加一些逻辑,出现异常时加一些逻辑。用途很多:入参的校验,异常处理,返回值......
  • python - 异常
    Exception和Error的区别python与java不一样,python的所有异常类,都继承自BaseException,并不严格区分Error和Exception。以SyntaxError为例,名字虽然叫Error,但实际也是继承自Exception。java的规范:将可预知的,而不影响程序执行的,称之为Exception,比如:参数格式不......
  • python - 基础数据类型
    基础数据类型基础数据类型空值(none)整数(int):表示整数,例如x=2。浮点数(float):表示带有小数点的数值,例如y=1.23。复数(complex):包含实部和虚部的数值,例如z=4+4j。布尔值(bool):表示真(True)或假(False),例如is_true=True。字符串(str):表示文本数据,例如text="Welcome,......
  • python - import
    import语法python中包要包含一个空的init.py文件#引用同级目录的a.pyimporta#向上一级文件夹,引用imath(同一个包才能这么调用,如果是主模块会报错)from..importimath#向上两级文件夹,引用imath(同一个包才能这么调用,如果是主模块会报错)from...importimath......
  • python - 面向对象
    面向内容与java一致,包含三大特点:封装、继承和多态。定义一个对象classPerson:#构造函数def__init__(self,name,age):self.name=nameself.age=age#定义一个函数defsay_hello(self):print("Hello{}!".format(self.......
  • python - 函数
    标准写法定义一个函数,函数名叫summary(),函数有两个参数:a和b,a的默认值为1,b的默认值为2;:int指定参数为int类型(注解);->int指定返回值为int(注解);r""""""是标准的函数注释;要是空函数,还没想好功能,用pass进行占位defsummary(a:int=1,b:int=2)->int:......
  • Java面试要点54 - Java List的二分查找算法
    文章目录一、引言二、二分查找的基本原理三、JavaCollections工具类中的二分查找四、自定义比较器的二分查找实现五、处理特殊情况六、性能优化与最佳实践七、总结一、引言在Java程序开发中,查找操作是一个非常基础且关键的算法需求。其中,二分查找(BinarySearch)......