前言
本文主要讲解了算法的效率分析、常见的复杂度,并通过timeit模块来初步确定Pyhon的运行性能分析。
1. 引入_2
1.5 算法效率的分析
分析算法时,存在几种可能的考虑:
算法完成工作最少需要多少基本操作,即最优时间复杂度
算法完成工作最多需要多少基本操作,即最坏时间复杂度。
算法完成工作平均需要多少基本操作,即平均时间复杂度
对于最优时间复杂度,其价值不大,因为它没有提供什么有用信息,其反映的只是最乐观最理想的情况,没有参考价值。
对于最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作。
对于平均时间复杂度,是对算法的一个全面评价,因此它完整全面的反映了这个算法的性质。但另一方面这种衡量并没有保证,不是每个计算都能在这个基本操作内完成。而且,对于平均情况的计算,也会因为应用算法的实例分布可能并不均匀而难以计算。因此,我们主要关注算法的最坏情况,亦即最坏时间复杂度。
时间复杂度的几条基本计算规则
1.基本操作,即只有常数项,认为其时间复杂度为O(1)
2.顺序结构,时间复杂度按加法进行计算
3.循环结构,时间复杂度按乘法进行计算
4.分支结构,时间复杂度取最大值; 哪个分支步数最多,就是多少
5.判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
6.在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
举个例子就是上一节所提到的优化过后的代码的时间复杂度计算:
1.6 常见复杂度
如上表所示,这个是常见的复杂度计算方式。
1.7 Python内置类型性能分析
我们可以通过Python里内置的timeit来去
列表知识点1:列表可以相加得到一个新列表;
列表知识点2:列表也可以通过for循环得到;
列表知识点3:Python2通过range操作可以直接返回列表;但是Python3需要配合list()生成。
列表知识点4:可以直接往列表里加
然后我们分别定义刚才不同方法的列表,并比较时间。
知识点5:timer参数是一个定时器函数,与平台有关。
知识点6:timer.timeit(number)是Timer类中测试语句执行速度的对象方法。number默认为1000000次,输出执行代码的平均耗时。
知识点7:timeit.Timer.timeit(1000) 真实的函数调用
最后我们可以通过timeit中的Timer来
下面开始一个从尾部追加,一个从列表头部追加,看下这两种到底有无区别。
可以看出insert运行要比append慢,至于为什么慢,等讲到1.8节的时候,我们就会明白。
另外,list()类型和dict()类型实际上是不能算作基本数据类型的,只是Pyhton给我们封装好的。那么基本数据类型就是字符、整型和浮点型。而list和dict只是Python给我们封装好的一个容器,而非基本类型。