Python数据类型的性能

前面我们学习了大O表示法,今天来讨论一下python两种内置数据类型的大O数量级,列表list和字典dict,这是python两种重要的数据类型,后面的课程会用来实现各种数据结构,我们这里通过运行试验来估计其各种操作运行时间的数量级。


1.对比list和dict的操作

python 不同数据类型在一起 python不同数据类型比较_python数据类型

正查是根据索引来获得数据项,反查是由数据项获得它的索引。


2.List列表数据类型常用的操作性能

列表这个数据类型各种操作的实现方法有很多,我们在选择具体的哪种实现方法时,总的方案就是让最常用的操作性能最好,牺牲不太常用的操作,这里就可以遵循8020准则(80%的功能,其使用率只有20%)把利用率达到80%的操作,让他们达到性能最好就可以了,这样整体的性能就会提升。

最常用的:按索引取值和赋值(v=a[i],a[i]=v)

由于列表的随机访问特性,这两个操作执行时间与列表大小无关,均为O(1);

另一个是列表增长,可以选择append()和_add_()"+"

list.append(v) 执行时间是O(1)

list=list+[v] 执行时间是O(n+k) 其中k是增加的列表的长度。

加法其实是生成了一个新的列表,然后再复制过去,所以它的执行时间是n+k,问题规模包括原列表的大小和增加列表的大小。

选择哪个方法来操作列表决定了程序的性能。


3.四种生成前n个整数列表的方法

test1是循环连接列表(+)的生成方式;test2是用append方法添加元素生成;test3用列表推导式;test4用range函数调用转成列表。这四种方法的性能会相差多少呢?我们用timeit模块对函数计时。

python 不同数据类型在一起 python不同数据类型比较_执行时间_02


4.用timeit模块对函数计时

创建一个timer对象,指定需要反复运行的语句和只需要运行一次的“安装语句”,然后调用这个对象的timeit方法,其中可以指定反复运行多少次。

这里我们不用原来介绍的time.teme,因为我们知道算法所执行的时间都太快了,如果我们执行test 1到test 4这个函数,只调用一次的话,时间几乎都是零,就没有办法比较,所以我们要将执行的时间放大,通过反复的执行,执行多次来实现,这时我们需要用到timeit模块。timeit模块的用法,最主要的就是用他的timer对象象,生成timer对象的时候需要有两个参数,第一个参数就是你要反复执行的语句,这个语句以字符串的形式给timer。第二个参数就是只需要运行1次的所谓的“安装语句”setup语句,反复运行语句里头如果出现了什么样的变量,我需要从安装语句中import进来。有了timer对象之久,我们就可以调用对象的timeit这个方法,这个方法里面就可以指定number等于多少,即指定语句需要反复执行多少次,这样就会反复运行语句指定的次数。

比如这里的t1等于timer然后调用test1,test1是需要反复运行的语句;第二个是setup语句,因为test1属于我们主程序的一个名字,在主程序名字空间当中,所以我们要import进来,所以会有“from_main_import test1”两个下划线界定的main即表示主程序命名空间。生成了t1之后,我们用t1.timeit(number=1000)表示调用1000次的test1(相当于用for循环range(1000)把test1调用1000次)

python 不同数据类型在一起 python不同数据类型比较_List_03


5.分析结果

我们运行一下看结果

可以看到四种方法的运行时间差别很大,“+”是最慢的,需要约1.88秒,最快的是list(range(1000)),只用了约0.009秒,速度相差近200倍,append也要比“+”快得多,另外,我们注意到列表推导式的速度是append两倍的样子,同样是增长列表的几种方式,之间的性能是有显著差异的。

python 不同数据类型在一起 python不同数据类型比较_执行时间_04


6.List基本操作的大O数量级

最后看一下list当中一些基本操作的大O数量级.第一个排在最前面的操作是index,就是按下标取值,数量级为O(1),这里注意一下pop()删除,如果不加任何参数,就是从最后一个开始删,数量级就是O(1),如果从中间某个开始删的话,数量级就变为O(n),同样一个操作,有时它的复杂度也会不一样。

python 不同数据类型在一起 python不同数据类型比较_python数据类型_05


python 不同数据类型在一起 python不同数据类型比较_执行时间_06

明天带大家测试pop()两种不一样的数量级,探究探究,以及dict的登场~感谢大家的阅读。(◕ᴗ◕✿)