python字典、列表、元组的区别
1、三者区别
列表:C语言实现的动态数组,有序,异构,可修改,内存开销稍小,性能稍差
字典:C语言实现的哈希表,无序,异构,可修改,内存开销稍大,性能更好
元组:C语言实现的静态数组,有序,异构,无法修改,性能略优于列表
2、列表和元组的定义
列表和元组都是一个可以放置任意数据类型的有序集合。这里需要注意三个词,任意、有序、集合,其实就是说明列表和元组是可以放置任意数据类型,其次是有序的,另外,它是一个集合。
列表是动态的,它的长度大小不固定的,可以随意的增加、删除或者改变。
l=[1,2,1,2,'name']
l[4]='hello'
print(l)
[1, 2, 1, 2, 'hello']
元组是静态的,它的长度大小是固定的,无法增加、删除或者改变。
l=(1,2,1,2,'name')
l[4]='hello'
print(l)
TypeError Traceback (most recent call last)
<ipython-input-7-1bc67cb7b49e> in <module>
1 l=(1,2,1,2,'name')
----> 2 l[4]='hello'
3 print(l)
TypeError: 'tuple' object does not support item assignment
3、列表和元组的存储方式
列表是动态的、可变的,而元组是静态的、不可变的。
列表的存储方式,如下所示:
l=[]
print(l.__sizeof__())
l=[1]
print(l.__sizeof__())
l=[1,2]
print(l.__sizeof__())
l=[1,2,3]
print(l.__sizeof__())
l=[1,2,3,4]
print(l.__sizeof__())
40
48
56
64
72
元组的存储方式,如下所示:
l=()
print(l.__sizeof__())
l=(1,)
print(l.__sizeof__())
l=(1,2)
print(l.__sizeof__())
l=(1,2,3)
print(l.__sizeof__())
l=(1,2,3,4)
print(l.__sizeof__())
24
32
40
48
56
存储同样的元素,元组使用的存储空间更小,要少16个字节。这是因为列表是动态的,所以列表中要存储指针,来指向对应的元素。另外,列表是可变的,所以需要额外存储已经分配的存储信息,因为它要知道现在已经存储了多少信息,还剩下多少,需不需要额外分配存储空间等等。所以,列表多出来的存储空间主要是:指针 + 存储空间长度。
如下例子可以看到列表存储空间的变化:
列表存储空间变化:
l=[]
print(f'列表:{l}')
print(l.__sizeof__())
l.append(1)#增加一个元素,存储空间增加32字节,由于添加的元素为int类型(8字节),那么可以存放32/8=4个元素。
print(f'列表:{l}')
print(l.__sizeof__())
l.append(2)#增加一个元素
print(f'列表:{l}')
print(l.__sizeof__())
l.append(3)
print(f'列表:{l}')
print(l.__sizeof__())
l.append(4)
print(f'列表:{l}')
print(l.__sizeof__())
l.append(5)#加入元素 5 之后,列表的空间不足,所以又额外分配了可以存储空间
print(f'列表:{l}')
print(l.__sizeof__())
列表:[]
40
列表:[1]
72
列表:[1, 2]
72
列表:[1, 2, 3]
72
列表:[1, 2, 3, 4]
72
列表:[1, 2, 3, 4, 5]
104
4、列表和元组的性能
从列表和元组的存储方式可以得出,元组的性能是优于列表的。
元组和列表的初始化性能比较:
import timeit
print(timeit.timeit(stmt='x=(1,2,3,4,5,6)',number=100000))
print(timeit.timeit(stmt='x=[1,2,3,4,5,6]',number=100000))
0.004769199999827833
0.01035909999973228