1、python列表

  1. 在CPython中,列表被实现为长度可变的数组。
  2. 列表对象在 C 程序中的数据结构:有一个指针数组用来保存列表元素的指针,和一个可以在列表中放多少元素的标记。
  3. 内存的槽的个数并不是当前列表就有这么多的元素,列表元素的个数和 len(列表)是一样,就是真正的元素的个数。
  4. 但分配的槽的大小,会比元素个数大一点,目的就是为了防止在每次添加元素的时候都去调用分配内存的函数。

2、C中数组存储方式

  1. 必须牢记:定义并初始化一个数组后,在内存里分配了两个空间,一个用于存放数组的引用变量,一个用于存放数组本身。
  2. 数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。
  3. 如果我们希望在程序中访问数组,则只能通过这个数组的引用变量来访问它。
  4. 实际的数组元素被存储在堆(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、列表和元组比较

  1. 列表是动态的,其大小可以改变(重新分配);
  2. 而元组是不可变的,一旦创建就不能修改。
  3. list和tuple在c实现上是很相似的,对于元素数量大的时候,都是一个数组指针,指针指向相应的对象,找不到tuple比list快的理由。
  4. 但对于小对象来说,tuple会有一个对象池,所以小的、重复的使用tuple还有益处的。

5、tuple使用场景

  1. 实际情况中的确也有不少大小固定的列表结构,例如二维地理坐标等;
  2. 另外tuple也给元素天然地赋予了只读属性;

6、列表与字典比较

  1. list是有序的,dict是无序的
  2. list通过索引访问,dict使用key访问
  3. list随着数量的正常增长要想查找元素的时间复杂度为O(n), dict不随数量而增长而变化,时间负责都为O(1)

7、列表和字典应用场景

  1. list一般可作为队列、堆栈使用,而dict一般作为聚合统计或者快速使用特征访问等
  2. list 是记录简单有序数据的,就是一对一的那种,可以理解为一维数组.
  3. dict 是记录复杂无序数据,就是一对多,可以理解为多维数组.