美文网首页
列表和元组,到底用哪一个?

列表和元组,到底用哪一个?

作者: 倔强的潇洒小姐 | 来源:发表于2019-05-15 21:57 被阅读0次

一、列表和元组相同点:

  • 一个可以放置任意数据类型的有序集合
  • 支持负数索引(-1 表示最后一个元素,-2 表示倒数第二个元素,以此类推)
  • 支持切片操作
  • 可以随意嵌套

二、列表和元组区别:

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

注:
list.reverse() 和 list.sort() 分别表示原地倒转列表和排序(注意,元组没有内置的这两个函数)

reversed() 和 sorted() 同样表示对列表/ 元组进行倒转和排序,但是会返回一个倒转后或者排好序的新的列表 / 元组

三、列表和元组存储方式的差异

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

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 个元素的空间

2、元组长度大小固定,元素不可变,所以存储空间固定

四、列表和元组的性能

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

Python 会在后台,对静态数据做一些资源缓存(resource caching)。
通常来说,因为垃圾回收机制的存在,如果一些变量不被使用了,Python 就会回收它们所占用的内存,返还给操作系统,以便其他变量或其他应用使用

但是对于一些静态变量,比如元组,如果它不被使用并且占用空间不大时,Python 会暂时缓存这部分内存。这样,下次我们再创建同样大小的元组时,Python 就可以不用再向操作系统发出请求,去寻找内存,而是可以直接分配之前缓存的内存空间,这样就能大大加快程序的运行速度。

注:如果想要增加、删减或者改变元素,那么列表显然更优

五、列表和元组的使用场景

1、如果存储的数据和数量不变,那么肯定选用元组更合适
比如有一个函数,需要返回的是一个地点的经纬度,然后直接传给前端渲染

  1. 如果存储的数据或数量是可变的,那么肯定选用列表更合适
    比如社交平台上的一个日志功能,是统计一个用户在一周之内看了哪些用户的帖子

六、思考题

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

# 创建空列表
# option A
empty_list = list()

# option B
empty_list = []

解释:
区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,而 []是一个内置的C函数,可以直接被调用,因此效率高。

import  timeit

print(timeit.timeit('a=list()', number=1000000))    # 0.07735428800000001
print(timeit.timeit('a=[]', number=1000000))     # 0.022829580000000002
print(timeit.timeit('a=()', number=1000000))    # 0.012448818

七、疑问点

list的内部实现是over-allocate array的形式

  1. 那在需要扩容的时候,是不是也是需要重新开辟一块连续的内存空间呢?
  2. 每次扩容都会预留一些空间,这里面有没有公式,公式是什么呢

相关文章

  • 极客时间Python核心技术与实践笔记

    1 2 03 | 列表和元组,到底用哪一个? 列表和元组,都是一个可以放置任意数据类型的有序集合,与其它语言相比较...

  • Python核心技术与实战:学习笔记(一)

    03|列表和元组,到底用哪一个? 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)...

  • Python3 的数据类型3-元组

    元组和列表相似,但元组的元素值不能改变,而列表可以改变。元组用(),列表用[] 1. 元组的创建 元组直接用小括号...

  • 列表和元组,到底用哪一个?

    一、列表和元组相同点: 一个可以放置任意数据类型的有序集合 支持负数索引(-1 表示最后一个元素,-2 表示倒数第...

  • Python元组

    元组 元组和列表相似,不同点元组定义后不能改变,列表可以做改变。 元组用小括号,列表用中括号。 列表常用操作 打印...

  • Python入门(六)

    元组 列表用[]或者list函数,元组用()或者tuplue 元组是Python的另一种特色的数据类型 元组和列表...

  • Python数据类型-元组

    5、元组(Tuple) 元组和列表类似,不同之处是元组用()将元素扩起来,而列表是用[];其次,列表中的元素可以修...

  • 【Python_67-70】元组【b站搬运_子木】

    什么是元组? 元组不可增删改(是不可变序列!列表和字典可变) 元组用()定义 vs 列表用 [ ] 定义 可变序列...

  • 14-元组

    元组定义 元组(Tuple)和列表类似,不同之处在于元组不能修改。 用于存储一窜信息,数据之间用,分开 元组用()...

  • 第三周python学习2019-01-06

    这周有写懈怠。 元组和列表的异同: 不同:元组用小括号,列表用中括号 每个元组在小括号之间至少要包含一个逗号,即使...

网友评论

      本文标题:列表和元组,到底用哪一个?

      本文链接:https://www.haomeiwen.com/subject/kanmaqtx.html