一.引言

  - 现在大家对 大O 算法和不同函数之间的差异有了了解。本节的目标是告诉你 Python 列表和字典操作的 大O 性能。然后我们将做一些基于时间的实验来说明每个数据结构的花销和使用这些数据结构的好处。重要的是了解这些数据结构的效率,因为它们是本博客实现其他数据结构所用到的基础模块。本节中,我们将不会说明为什么是这个性能。在后面的博文中,你将看到列表和字典一些可能的实现,以及性能是如何取决于实现的。

二.列表:

  - python 的设计者在实现列表数据结构的时候有很多选择。每一个这种选择都可能影响列表操作的性能。为了帮助他们做出正确的选择,他们查看了最常使用列表数据结构的方式,并且优化了实现,以便使得最常见的操作非常快。

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

    - 让我们看看四种不同的方式,我们可以生成一个从0开始的n个数字的列表。首先,我们将尝试一个 for 循环并通过创建列表,然后我们将使用 append 而不是拼接。接下来,我们使用列表生成器创建列表,最后,也是最明显的方式,通过调用列表构造函数包装 range 函数。

  

  1. def test1():
  2. l = []
  3. for i in range(1000):
  4. l = l + [i]
  5.  
  6. def test2():
  7. l = []
  8. for i in range(1000):
  9. l.append(i)
  10.  
  11. def test3():
  12. l = [i for i in range(1000)]
  13.  
  14. def test4():
  15. 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次的平均耗时。

    - 案例:

  1. from timeit import Timer
  2. #被测试的代码块
  3. def func(n):
  4. sum = 0
  5. for i in range(0,100):
  6. sum += i
  7. print(sum)
  8.  
  9. if __name__ == "__main__":
  10. #参数2:因为参数1必须为字符串且表示的是即将被测试代码块函数的名字,因此参数2必须设置为执行参数1函数所需的设置
  11. t = Timer('func(10)','from __main__ import func')
  12. print(t.timeit(1000))

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

  1. t1 = Timer("test1()", "from __main__ import test1")
  2. print("concat ",t1.timeit(number=1000), "milliseconds")
  3. t2 = Timer("test2()", "from __main__ import test2")
  4. print("append ",t2.timeit(number=1000), "milliseconds")
  5. t3 = Timer("test3()", "from __main__ import test3")
  6. print("comprehension ",t3.timeit(number=1000), "milliseconds")
  7. t4 = Timer("test4()", "from __main__ import test4")
  8. print("list range ",t4.timeit(number=1000), "milliseconds")
  9.  
  10. concat 6.54352807999 milliseconds
  11. append 0.306292057037 milliseconds
  12. comprehension 0.147661924362 milliseconds
  13. list range 0.0655000209808 milliseconds

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

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

三.字典

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

  - 字典的时间复杂度:

 

2.python数据结构的性能分析的更多相关文章

  1. 02 Python数据结构的性能分析

    一.列表: - python 的设计者在实现列表数据结构的时候有很多选择.每一个这种选择都可能影响列表操作的性能.为了帮助他们做出正确的选择,他们查看了最常使用列表数据结构的方式,并且优化了实现,以便 ...

  2. 二.python数据结构的性能分析

    目录: 1.引言 2.列表 3.字典 一.引言 - 现在大家对 大O 算法和不同函数之间的差异有了了解.本节的目标是告诉你 Python 列表和字典操作的 大O 性能.然后我们将做一些基于时间的实验来 ...

  3. 2 数据结构的性能分析 timeit

    # python数据结构的性能分析 https://www.cnblogs.com/bobo-zhang/p/10521769.html from timeit import Timer #计算运行平 ...

  4. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  5. Python内置类型性能分析

    Python内置类型性能分析 timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass' ...

  6. 【Python】常用排序算法的python实现和性能分析

    作者:waterxi 原文链接 背景 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整 ...

  7. 面试中常用排序算法的python实现和性能分析

    这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...

  8. Python程序的性能分析指南(转)

    原文地址 :http://blog.jobbole.com/47619/ 虽然不是所有的Python程序都需要严格的性能分析,不过知道如何利用Python生态圈里的工具来分析性能,也是不错的. 分析一 ...

  9. Python内置性能分析模块timeit

    timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', timer=<tim ...

随机推荐

  1. Docker配置阿里云加速地址

    首先需要注册一个阿里云账号,只要注册账号就可以,不用充钱购买任何阿里云服务! 打开阿里云网站https://cr.console.aliyun.com,登陆自己的阿里云账号. 然后只需要在服务器配置d ...

  2. HLOCAL 初探

    首先看一段程序,输出的结果为两个相同的整数(这两个整数是内存地址). #include "stdafx.h" #include <windows.h> int _tma ...

  3. C#微信小程序服务端获取用户解密信息

    using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.C ...

  4. 前m大的数(hdu1280)

    前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. python学习之老男孩python全栈第九期_day012知识点总结

    # def wrapper(f):# def inner(*args,**kwargs):# print('在被装饰的函数执行之前做的事')# res = f(*args,**kwargs)# pri ...

  6. element-ui Collapse 折叠面板源码分析整理笔记(十)

    Collapse 折叠面板源码: collapse.vue <template> <!--一组折叠面板最外层包裹div--> <div class="el-co ...

  7. HTML5 简单归纳 -- 前端知识 (一)

    HTML5简介 1.h5不是一个新语言,它是HTML语言第五次重大修改--版本 2.   2014年  h5 3.支持:目前所有的主流浏览器都支持h5,IE8以下不支持 4.特性: a:抛弃了h4中不 ...

  8. 【读书笔记】iOS-网络-使用Game Kit实现设备间通信

    Apple的Game Kit框架可以实现没有网络状况下的设备与设备之间的通信,这包括没有蜂窝服务,无法访问Wi-Fi基础设施以及无法访问局域网或Internet等情况.比如在丛林深处,高速公路上或是建 ...

  9. ionic安卓tab栏跑到顶部

    安卓下的ionic的tab会在顶部显示,而不是在底部 解决办法如下: 在app.js文件中的.config代码块里中添加以下代码: 注意依赖注入$ionicConfigProvider $ionicC ...

  10. ubuntu下android开发工作环境搭建

    www.bubuko.com/infodetail-655571.html 解压软件安装: sudo apt-get install unrar rar zip gzip  串口工具安装: sudo ...