共同点:
列表和元祖都是一个可以放任意数据类型的有序集合,并且不要求集合中的元素类型统一
`
不同点:
可修改性:
- 列表是动态的,长度大小不固定,可以增删改(mutable);元组是静态的,长度大小固定,无法增删改(immutable)
- 元组内嵌套列表,列表这个元素本身是可以变化的,但不能直接修改元组元素,只能修改这个列表元素本身的值
- 列表内嵌套元组,元组这个元素本身是不可变的,只能变化列表的元组本身对应的元素
列表和元组的存储空间
相同元素列表所占内存要比元组多,原因如下:
- 列表需要存储指针来指向对应的元素
- 列表为可变的,会额外分配出一些空间;元组长度大小固定,元素不可变,所以存储空间固定
- 需要额外存储已经分配的长度大小,方便实时追踪列表空间的使用情况,空间不够时及时分配。(over-allocating)保证了其操作的高效性:增加 / 删除的时间复杂度均为 O(1)。
- 查看空间:list.sizeof()、tuple.sizeof()
列表和元祖的性能
-
静态变量资源缓存,元组更优(垃圾回收机制):对于静态数据做一些资源缓存,一些变量不被使用时会被回收,但如果占用空间不大时python会暂时缓存这部分内存,下次我们再创建同样大小的元组时可以直接被分配之前缓存的内存空间,大大加快了程序的运行速度。
python3 -m timeit 'x=(1,2,3,4,5,6)'
20000000 loops, best of 5: 9.97 nsec per loop
python3 -m timeit 'x=[1,2,3,4,5,6]'
5000000 loops, best of 5: 50.1 nsec per loop -
索引操作,速度差别小
python3 -m timeit -s 'x=[1,2,3,4,5,6]' 'y=x[3]'
10000000 loops, best of 5: 22.2 nsec per loop
python3 -m timeit -s 'x=(1,2,3,4,5,6)' 'y=x[3]'
10000000 loops, best of 5: 21.9 nsec per loop -
增删改,列表更优:对于元组,必须得通过新建一个元组来完成
-
创建空列表,以下哪种方法优
-- empty_list = list()----效率低
-- empty_list = []--------效率高
``原因:区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,反观[]是一个内置的C函数,可以直接被调用,因此效率高。
python3 -m timeit 'empty_list = list()'
5000000 loops, best of 5: 68.4 nsec per loop
python3 -m timeit 'empty_list = []'
10000000 loops, best of 5: 24.4 nsec per loop
python3 -m timeit 'empty_list = ()'
20000000 loops, best of 5: 13 nsec per loop
内置函数
- lt.count(item): 统计列表 / 元组中 item 出现的次数。
- lt.index(item): 返回列表 / 元组中 item 第一次出现的索引
- l.reverse(): 原地倒转列表
- l.sort(): 原地列表排序
- l.append(item): 列表最佳元素
- reversed(l/t): 返回一个倒转后的迭代器(上文例子使用 list() 函数再将其转换为列表)
- sorted(l/t): 返回排好序的新列表
- list(tuple)、tuple(list): 元组列表间的转化
- lt[m:n]: 切片:0标识前面第一个元素,-1表示后面数最后一个元素