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

  - 字典的时间复杂度:

Python数据结构性能分析的更多相关文章

  1. 关于python数据序列化的那些坑

    -----世界上本来没那么多坑,python更新到3以后坑就多了 无论哪一门语言开发,都离不了数据储存与解析,除了跨平台性极好的xml和json之外,python要提到的还有自身最常用pickle模块 ...

  2. Python数据可视化编程实战——导入数据

    1.从csv文件导入数据 原理:with语句打开文件并绑定到对象f.不必担心在操作完资源后去关闭数据文件,with的上下文管理器会帮助处理.然后,csv.reader()方法返回reader对象,通过 ...

  3. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  4. Python数据网络采集5--处理Javascript和重定向

    Python数据网络采集5--处理Javascript和重定向 到目前为止,我们和网站服务器通信的唯一方式,就是发出HTTP请求获取页面.有些网页,我们不需要单独请求,就可以和网络服务器交互(收发信息 ...

  5. Python数据可视化——使用Matplotlib创建散点图

    Python数据可视化——使用Matplotlib创建散点图 2017-12-27 作者:淡水化合物 Matplotlib简述: Matplotlib是一个用于创建出高质量图表的桌面绘图包(主要是2D ...

  6. Python数据可视化-seaborn库之countplot

    在Python数据可视化中,seaborn较好的提供了图形的一些可视化功效. seaborn官方文档见链接:http://seaborn.pydata.org/api.html countplot是s ...

  7. Python数据可视化编程实战pdf

    Python数据可视化编程实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1vAvKwCry4P4QeofW-RqZ_A 提取码:9pcd 复制这段内容后打开百度 ...

  8. Python数据科学手册

    Python数据科学手册(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1KurSdjNWiwMac3o3iLrzBg 提取码:qogy 复制这段内容后打开百度网盘手 ...

  9. 预测python数据分析师的工资

    前两篇博客分别对拉勾中关于 python 数据分析有关的信息进行获取(https://www.cnblogs.com/lyuzt/p/10636501.html)和对获取的数据进行可视化分析(http ...

随机推荐

  1. 20.DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    一 认证组件 1. 局部认证组件 我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发, 在咱们看的APIView类中的dispatch方法的源码中,有个sel ...

  2. 虚拟链路(virtual-link)

    第四部分,虚拟链路配置.我们都知道,在ospf多区域中,所有与主干区域(ospf0)相连接的其他区域可以相互学系路由信息,但是,如果是非主干区域和非主干区域相连,就不能相互学习路由信息,这时候,我们可 ...

  3. hdu 6298 Maximum Multiple (简单数论)

    Maximum Multiple Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. SpringBoot电商项目实战 — Zookeeper的分布式锁实现

    上一篇演示了基于Redis的Redisson分布式锁实现,那今天我要再来说说基于Zookeeper的分布式现实. Zookeeper分布式锁实现 要用Zookeeper实现分布式锁,我就不得不说说zo ...

  5. Linux Bash之通配符

    通配符是我们在shell环境中不知不觉中都会用到的,有时甚至都不会考虑到去探究其实现过程,因为使用得太普遍了.而清晰地理解每一个过程,将有助于我们的分析和调试. 说白了,通配符就是在 shell 环境 ...

  6. 手把手教你DIY尼康ML-L3红外遥控器

    项目介绍 ML-L3是用于尼康部分型号相机的无线红外遥控器,可以通过红外方式来控制快门的释放,支持B门拍摄.官方售价100RMB左右,山寨版售价10RMB左右.虽然也能实现基本的遥控功能,但是功能还是 ...

  7. visualStudio 的一些常用使用操作总结

    今年苟了差不多一整年,期间断断续续把c++ prime plus 看完了 ,发现并没有什么鸟用 ,但是对代码怎么形成二进制的过程 动态内存管理 这些模模糊糊的确实理解更深刻些了 特别是c++过度到c# ...

  8. nfs 所有的版本的 RFC 整理; nfs 所有版本对比;

    下面是针对 nfs 所有的版本,我们可以通过不同的RFC 进行详细看其RFC的细节来进行对比: 下面是备忘一些NFS RFC 的链接: https://datatracker.ietf.org/doc ...

  9. 一文解读Docker (转)

    最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料.本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学 ...

  10. ReactNative: 使用网页组件WebView组件

    一.简介 在移动端开发中,很多时候需要嵌入一个网页来帮助实现某一个活动,这方式大大提高了活动快速迭代的灵活性,在RN中,同样也这么处理这种情况的.其实,这种混合式开发称为Hybird APP,它们就是 ...