目录:

1.引言

2.列表

3.字典

一.引言

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

二.列表:

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

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

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

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 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))
#结果:0.0075032 #每次结果运算的时间应该会有所不同

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

from timeit import Timer
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)) if __name__ == '__main__':
t1 = Timer("test1()", "from __main__ import test1")
print("concat ",t1.timeit(number=1000), "milliseconds")
t2 = Timer("test2()", "from __main__ import test2")
print("append ",t2.timeit(number=1000), "milliseconds")
t3 = Timer("test3()", "from __main__ import test3")
print("comprehension ",t3.timeit(number=1000), "milliseconds")
t4 = Timer("test4()", "from __main__ import test4")
print("list range ",t4.timeit(number=1000), "milliseconds")

执行结果:

concat  2.7648504000000003 milliseconds
append 0.1303709999999998 milliseconds
comprehension 0.07775989999999977 milliseconds
list range 0.020507900000000134 milliseconds

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

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

三.字典

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

  - 字典的时间复杂度:

最新文章

  1. 指令的Link函数和Scope
  2. JS 中 new 操作符
  3. Android jni helloworld
  4. hdu-5491 The Next(贪心)
  5. Windows 下的 MarkdownPad 2 工具使用
  6. MC, MCMC, Gibbs采样 原理&实现(in R)
  7. ASP 发送邮件
  8. Ubuntu配置Android编译环境
  9. Design Pattern ——Factory Method&Abstract Factory
  10. linux设置虚拟内存(swap)解决mysql因内存不足挂掉的故障
  11. sax(用于处理XML事件驱动的推模型)解析例子
  12. 《OpenCV3编程入门》访问图像中像素的三类方法
  13. (中等) CF 311B Cats Transport,斜率优化DP。
  14. Unity3d 协程
  15. C#中,重新排列panel中的按钮
  16. base64 压缩图片
  17. 解决PHP curl https时error 77(Problem with reading the SSL CA cert (path? access rights?))
  18. Anti-Forgery Request Recipes For ASP.NET MVC And AJAX
  19. Jquery Gritter set position
  20. ZJOI2018外省选手酱油记Day1

热门文章

  1. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]
  2. win7安装mysql8提示one more product requirements have not been satisified
  3. yum与rpm常用选项
  4. Blow up the city
  5. alter table 修改表结构规范
  6. 通过游戏学python 3.6 第一季 第五章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆 可复制直接使用 娱乐 可封装 函数
  7. 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]
  8. PHP通过sql生成CSV文件并下载,PHP实现文件下载
  9. 小米网关api
  10. Django项目:CRM(客户关系管理系统)--12--05PerfectCRM实现King_admin注册功能获取内存01