You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
$ python3 -m timeit 'x=(1,2,3,4,5,6)'
20000000 loops, best of 5: 19 nsec per loop
python3 -m timeit 'x=[1,2,3,4,5,6]'
5000000 loops, best of 5: 90.3 nsec per loop
但如果是索引操作的话,两者的速度差别非常小,几乎可以忽略不计:
$ python3 -m timeit -s 'x=(1,2,3,4,5,6)''y=x[3]'
5000000 loops, best of 5: 43 nsec per loop
$ python3 -m timeit -s 'x=[1,2,3,4,5,6]''y=x[3]'
5000000 loops, best of 5: 42.1 nsec per loop
一、元组和列表都属于基础数据结构中的“数组”
tuple 和 list 的内部实现都是 array(数组)的形式,而不是 linked list(链表)。
基础数据结构中的数组、链表
应用场景:
数组、链表的区别:
数组的元素都在一起,即在内存中都是相连的(紧靠在一起的)。
链表的元素是分开的,链表中的元素可存储在内存的任何地方,其中每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
数组的元素带编号,元素的位置称为索引。
假设有一个数组
array = [1, 2, 3]
,第1个元素(索引为0的元素)是1(array[0] = 1
)。数组的读取速度很快。
需要随机地读取元素时,数组的效率很高,数组支持随机访问,因为知道其中每个元素的地址,可迅速找到数组的任何元素。
在链表中,元素并非都靠在一起的,必须先读取第一个元素,根据其中的地址再读取第二个元素,以此类推。链表只能顺序访问,要读取链表的第十个元素,得先读取前九个元素,并沿链接找到第十个元素。随机访问意味着可直接跳到第十个元素。
链表的插入和删除速度很快。
需要在中间插入元素时,使用链表插入元素很简单,只需修改它前面的那个元素指向的地址;而使用数组时,则必须将后面的元素都向后移。
删除元素,链表也是更好的选择,因为只需修改前一个元素指向的地址即可;而使用数组时,删除元素后,必须将后面的元素都向前移。
常见的数组和列表操作的运行时间( O~(n)~ 为线性时间,O~(1)~ 为常量时间):
二、元组和列表都是一个可以放置任意数据类型的有序集合
在绝大多数编程语言中,集合的数据类型必须一致。不过,对于 Python 的元组和列表来说,并无此要求:
三、元组是静态的,列表是动态的
四、元组和列表都支持负数索引
五、元组和列表都支持切片操作
六、元组和列表都可以随意嵌套
七、元组和列表可以通过
list()
和tuple()
函数相互转换八、元组和列表常用的内置函数
九、元组和列表存储方式的差异
根据以上分析元组和列表存储方式的差异,元组和列表储存空间大小差异似乎不大。
但是想象一下,如果列表和元组存储元素的个数是一亿,十亿甚至更大数量级时,还能忽略这样的差异吗?
十、元组和列表的性能
通常来说,因为垃圾回收机制的存在,如果一些变量不被使用了,Python 就会回收它们所占用的内存,返还给操作系统,以便其他变量或其他应用使用。
但是对于一些静态变量,比如元组,如果它不被使用并且占用空间不大时,Python 会暂时缓存这部分内存。
这样,下次我们再创建同样大小的元组时,Python 就可以不用再向操作系统发出请求,去寻找内存,而是可以直接分配之前缓存的内存空间,这样就能大大加快程序的运行速度。
初始化一个相同元素的元组和列表分别所需的时间:元组的初始化速度,要比列表快5倍(此处使用macOS):
但如果是索引操作的话,两者的速度差别非常小,几乎可以忽略不计:
十一、元组和列表的使用场景
The text was updated successfully, but these errors were encountered: