文章目录
前言
列表和元组之类的数据结构被称为数组。一个数组是数据在某种内在次序下的扁平列表。这一先验次序十分重要:知道了数据在数组中的确定位置,我们就能以 O(1)的复杂度得到它!
1.数组在列表中存在的方式
一台计算机的系统内存可以被看作是一系列编了号的桶,每个桶可以存放一个数字。这些数字可以被用来代表任何我们关心的变量(整数、浮点数、字符串,或其他数据结构),因为它们只是引用了数据被保存在内存中的位置。
当我们想要创建一个数组(也就是一个列表或元组)时,我们首先必须分配一块系统内存(其每一段都将被当成是一个整型大小的指向实际数据的指针)。这需要进入内核,操作系统的子进程,去申请使用 N 个连续的桶。
Python 中列表还记录了它们的大小,所以在分配的 6 个块中,仅可使用 5 个——第一个元素是列表的长度
假设我们需要获取数组的第一个元素,只需要去第一个桶(用M表示), M+1,并读出其中的值。另一方面,如果我们需要数组的第五个元素,可以去位于 M+5 的桶并读取其内容。总而言之,如果我们想要获取数组的第 i 个元素,就去桶 M+i。也就是说,只要我们的数据保存在连续的桶里且知道数据的顺序,就能一步( O(1))定位到数据所在的桶,无论我们的数组有多大
示例如下:
%%timeit l = range(10)
l[5]
##########
52.2 ns ± 3.63 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
%%timeit l = range(1000000)