1、python列表
- 在CPython中,列表被实现为长度可变的数组。
- 列表对象在 C 程序中的数据结构:有一个指针数组用来保存列表元素的指针,和一个可以在列表中放多少元素的标记。
- 内存的槽的个数并不是当前列表就有这么多的元素,列表元素的个数和 len(列表)是一样,就是真正的元素的个数。
- 但分配的槽的大小,会比元素个数大一点,目的就是为了防止在每次添加元素的时候都去调用分配内存的函数。
2、C中数组存储方式
- 必须牢记:定义并初始化一个数组后,在内存里分配了两个空间,一个用于存放数组的引用变量,一个用于存放数组本身。
- 数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。
- 如果我们希望在程序中访问数组,则只能通过这个数组的引用变量来访问它。
- 实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。
3、python列表操作时间复杂度
index() O(1)
append O(1)
pop() O(1)
pop(i) O(n)
insert(i,item) O(n)
del operator O(n)
reverse O(n)
sort O(nlogn)
4、列表和元组比较
- 列表是动态的,其大小可以改变(重新分配);
- 而元组是不可变的,一旦创建就不能修改。
- list和tuple在c实现上是很相似的,对于元素数量大的时候,都是一个数组指针,指针指向相应的对象,找不到tuple比list快的理由。
- 但对于小对象来说,tuple会有一个对象池,所以小的、重复的使用tuple还有益处的。
5、tuple使用场景
- 实际情况中的确也有不少大小固定的列表结构,例如二维地理坐标等;
- 另外tuple也给元素天然地赋予了只读属性;
6、列表与字典比较
- list是有序的,dict是无序的
- list通过索引访问,dict使用key访问
- list随着数量的正常增长要想查找元素的时间复杂度为O(n), dict不随数量而增长而变化,时间负责都为O(1)
7、列表和字典应用场景
- list一般可作为队列、堆栈使用,而dict一般作为聚合统计或者快速使用特征访问等
- list 是记录简单有序数据的,就是一对一的那种,可以理解为一维数组.
- dict 是记录复杂无序数据,就是一对多,可以理解为多维数组.