Python数据结构性能分析

1.目标

告诉大家Python列表和字典操作的 大O 性能。然后我们将做一些基于时间的实验来说明每个数据结构的花销和使用这些数据结构的好处

2.实操

在列表的操作有一个非常常见的编程任务就是是增加一个列表。我们马上想到的有两种方法可以创建更长的列表,可以使用 append 方法或拼接运算符。但是这两种方法那种效率更高呢。这对你来说很重要,因为它可以帮助你通过选择合适的工具来提高你自己的程序的效率。

  • 实例化一个空列表,然后将0-n范围的数据添加到列表中。(四种方式)
方式一:
def test01():
    alist = []
    for i in range(1000):
        alist += i
    return alist

方式二:
def test02():
    alist = []
    for i in range(1000):
        alist.append(i)
    return alist

方式三:
def test03():
    return [i for i in range(1000)]

方式四:
def test04():
    alist = list(range(1000))
    return alist

-下面我们来使用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 func(n):
    sum = 0
    for i in range(0,100):
        sum += i
    print(sum)

if __name__ == "__main__":
    #参数2:因为参数1必须为字符串且表示的是即将被测试代码块函数的名字,因此参数2必须设置为执行参数1函数所需的设置
    t = Timer('func(10)','from __main__ import func')
    print(t.timeit(1000))

  - timeit模块来计算上述四种方式的平均时长是多少

from timeit import Timer
def test01():
    alist = []
    for i in range(1000):
        alist += [i]
    return alist
def test02(): alist = [] for i in range(1000): alist.append(i) return alist
def test03(): return [i for i in range(1000)]
def test04(): alist = list(range(1000)) return alist if __name__ == '__main__': timer = Timer('test01()','from __main__ import test01') t1 = timer.timeit(1000) print(t1) timer2 = Timer('test02()','from __main__ import test02') t2 = timer.timeit(1000) print(t2) timer3 = Timer('test03()','from __main__ import test03') t3 = timer.timeit(1000) print(t3) timer4 = Timer('test04()','from __main__ import test04') t4 = timer.timeit(1000) print(t4) # 执行结果: 0.060362724815831825 0.058856628773583 0.05833806495468252 0.05742018511486435

注意:你上面看到的时间都是包括实际调用函数的一些开销,但我们可以假设函数调用开销在四种情况下是相同的,所以我们仍然得到的是有意义的比较。因此,拼接字符串操作需要 6.03毫秒并不准确,而是拼接字符串这个函数需要 6.03毫秒。你可以测试调用空函数所需要的时间,并从上面的数字中减去它。剩下的基于列表的其他操作大家也可以使用timeit进行平均耗时的测量计算。

  - 列表的相关操作的方法都是被封装好的,我们没有必要对相关操作的底层算法时间进行分析,下面直接给出大家一张基于列表操作的时间复杂度的表,供大家参考:

 

3. 字典

  - python 中第二个主要的数据结构是字典。你可能记得,字典和列表不同,你可以通过键而不是位置来访问字典中的项目

  - 字典的时间复杂度:

posted @ 2019-12-13 16:19  菜鸟学小白  阅读(339)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~