2.python数据结构的性能分析(运用timeit模块计算平均运行时长)
本节的目标是告诉大家Python列表和字典操作的 大O 性能。然后我们将做一些基于时间的实验来说明每个数据结构的花销和使用这些数据结构的好处
- 实例化一个空列表,然后将0-n范围的数据添加到列表中。(四种方式)
def test1(): l = [] for i in range(1000): l = l + [i] def test2(): l = [] for i in range(1000): l.append(i) def test3(): l = [i for i in range(1000)] def test4(): l = list(range(1000))
- 下面我们来使用timeit模块来计算上述四种方式的平均运行时长是多少:
- timeit模块:该模块可以用来测试一段python代码的执行速度/时长。
- Timer类:该类是timeit模块中专门用于测量python代码的执行速度/时长的。原型为:class timeit.Timer(stmt='pass',setup='pass')。
- stmt参数:表示即将进行测试的代码块语句。
- setup:运行代码块语句时所需要的设置。
- timeit函数:timeit.Timer.timeit(number=100000),该函数返回代码块语句执行number次的平均耗时。
- 案例:
from timeit import Timer def test01(): alist = [] for i in range(1000): alist = alist + [i] def test02(): alist = [] for i in range(1000): alist.append(i) def test03(): alist = [i for i in range(1000)] def test04(): alist = list(range(1000)) if __name__ == '__main__': t1 = Timer('test01()','from __main__ import test01') print(t1.timeit(number=1000)) t2 = Timer('test02()','from __main__ import test02') print(t2.timeit(number=1000)) t3 = Timer('test03()','from __main__ import test03') print(t3.timeit(number=1000)) t4 = Timer('test04()','from __main__ import test04') print(t4.timeit(number=1000))
执行结果:
1.427245729042511 0.08398291617004361 0.03463117467885013 0.015171500463509346
注意:你上面看到的时间都是包括实际调用函数的一些开销,但我们可以假设函数调用开销在四种情况下是相同的,所以我们仍然得到的是有意义的比较。因此,拼接字符串操作需要1.42毫秒并不准确,而是拼接字符串这个函数需要1.42 毫秒。你可以测试调用空函数所需要的时间,并从上面的数字中减去它。剩下的基于列表的其他操作大家也可以使用timeit进行平均耗时的测量计算。
- 列表的相关操作的方法都是被封装好的,我们没有必要对相关操作的底层算法时间进行分析,下面直接给出大家一张基于列表操作的时间复杂度的表,供大家参考:
字典
- python 中第二个主要的数据结构是字典。你可能记得,字典和列表不同,你可以通过键而不是位置来访问字典中的项目。
- 字典的时间复杂度: