【跟我学Python】第五章. Python 性能及优化
1.改进算法,选择合适的数据结构
一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进。在算法的时间复杂度排序上依次是:
O(1) -> O(lg n) -> O(n lg n) -> O(n^2) -> O(n^3) -> O(n^k) -> O(k^n) -> O(n!)
因此如果能够在时间复杂度上对算法进行一定的改进,对性能的提高不言而喻。但对具体算法的改进不属于本文讨论的范围,读者可以自行参考这方面资料。下面的内容将集中讨论数据结构的选择。
- 字典 (dictionary) 与列表 (list)
Python 字典中使用了 hash table,因此查找操作的复杂度为 O(1),而 list 实际是个数组,在 list 中,查找需要遍历整个 list,其复杂度为 O(n),因此对成员的查找访问等操作字典要比 list 更快。
dict.py
from time import time t = time() list = ['a','b','is','python','jason','hello','hill','with','phone','test', 'dfdf','apple','pddf','ind','basic','none','baecr','var','bana','dd','wrd'] #list = dict.fromkeys(list,True) print list filter = [] for i in range (1000000): for find in ['is','hat','new','list','old','.']: if find not in list: filter.append(find) print "total run time:" print time()-t
上述代码运行大概需要 16.09seconds。如果去掉行 #list = dict.fromkeys(list,True) 的注释,将 list 转换为字典之后再运行,时间大约为 8.375 seconds,效率大概提高了一半。因此在需要多数据成员进行频繁的查找或者访问的时候,使用 dict 而不是 list 是一个较好的选择。
- 集合 (set) 与列表 (list)
set 的 union, intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的问题可以转换为 set 来操作。
求list的交集
from time import time t = time() lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44] listb=[2,4,6,9,23] intersection=[] for i in range (1000000): for a in lista: for b in listb: if a == b: intersection.append(a) print "total run time:" print time()-t
上述程序的运行时间大概为:
total run time:
38.4070000648
使用set求交集
from time import time t = time() lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44] listb=[2,4,6,9,23] intersection=[] for i in range (1000000): list(set(lista)&set(listb)) print "total run time:" print time()-t
改为 set 后程序的运行时间缩减为 8.75,提高了 4 倍多,运行时间大大缩短。读者可以自行使用表 1 其他的操作进行测试。
set 常见用法
set(list1) | set(list2) | union | 包含 list1 和 list2 所有数据的新集合 |
set(list1) & set(list2) | intersection | 包含 list1 和 list2 中共同元素的新集合 |
set(list1) - set(list2) | difference | 在 list1 中出现但不在 list2 中出现的元素的集合 |
对循环的优化
对循环的优化所遵循的原则是尽量减少循环过程中的计算量,有多重循环的尽量将内层的计算提到上一层。 下面通过实例来对比循环优化后所带来的性能的提高。程序清单 4 中,如果不进行循环优化,其大概的运行时间约为 132.375。
相关推荐
"我跟爸爸学编程:从Python到C" 1. Python编程入门:Python是一种高级编程语言,易于学习和使用。这本书的第一部分介绍了Python编程语言的基本语法和常用库的使用方法,通过简单的例子和实践练习,孩子们可以快速...
#### 第五部分:Python备忘录 ##### 运算符 - **算术运算符**:如加减乘除。 - **比较运算符**:如等于、大于、小于等。 - **逻辑运算符**:如与、或、非等。 ##### 常用的内建函数 - **数据类型转换**:如`int...
### Python核心编程(中文 第二版):深入学习与实践 #### 书籍概述 《Python核心编程(中文 第二版)》是由Wesley Chun撰写的一部深入介绍Python语言的著作。该书作为Python编程领域内的一本经典之作,不仅在初版时...
对于Python学习,只要跟的我一步一步走,你还是多少都学到一些东西,上一次我发布第一遍Python实例五角星,今天是发布第二个实例Python蟒蛇,编程也给你们,我也帮你们注释,方便你们更好的理解,只要老老实实敲代码...
- **官方文档**:[Python官方网站](http://www.python.org)提供了详尽的文档和技术支持。 - **在线教程**:如菜鸟教程([http://www.runoob.com/python/python-tutorial.html]...
#### 二、跟我一起画个圆 在这一部分,学员将学习如何使用`turtle`库中的`circle()`函数来绘制圆形。例如: ```python from turtle import * speed(0) pencolor("red") for i in range(100): circle(25 + i) right...
在“从零开始学Python AI开发系列271”中,我们将深入理解列表的概念及其基本操作。 首先,列表是Python中用于存储一系列有序元素的容器,可以包含任意类型的对象,如数字、字符串、布尔值甚至其他列表。创建列表时...
《跟我一起学习嵌入式Linux开发》第一季的教程是一份专为初学者设计的实践指导资料,旨在帮助用户快速入门嵌入式Linux系统开发。教程以图文并茂的方式呈现,每一步操作都有清晰的截图,使学习过程更加直观易懂。然而...
在"Introduction_to_Python_Programming"这个项目中,我们主要探讨的是Python编程的基础知识,这是针对初学者或者第二学期学生设计的一系列问题和练习。Python是一种高级、解释型、交互式和面向对象的脚本语言,因其...
我之前也写了一篇关于面向对象编程的博客,两篇博客内容相近,包含了我这两次学习的全部内容 第一篇博客 1. 转义字符 \n:换行 \t:制表符,tab “\”号后面可以跟八进制或者十六进制来表示字符,如\141、\x61表示a ...
比较难知道学校的新书有什么,需要有一个推送新书的程序告诉我,比如说我关注的一个关键词有python,就会在新书出现python关键字的时候给我推送特别关注的新书 3.馆藏空闲通知,有时候,我想要借的书给别人借走...
5月4日 星期二 天气:好 心情:好 先回答问题 当然可以啦!! 我就是课余学习python的呀! 但是在开始还是再三考虑清楚哦 毕竟认真学习好一门计算机语言 其实就跟学习一门外语一样的 一样有很多名词概念要去记 规范...
如果对自然语言分类,有很多中分法,...比如“好”和“人”,两个元素和在一起是“好人”,而3和5和在一起是8,如果你认为是35,那就属于第二类和法了。 把我的这种分法抽象一下: 一种是:△ +□ = ○ 另外一种是:△
《跟我一起玩编程》源代码这个压缩包是一个与Python编程相关的资源集合,它包含了40个独立的Python代码文件,旨在帮助初学者逐步理解和实践编程。Python作为一种强大的、易学的开发语言,被广泛用于各种领域,如数据...
Git是编程中的基本技能之一,互联网公司几乎都在使用Git进行协作编程,昨天还有位禅友在微信上专门告诉我说星期五面试的时候刚好被问到 Git,幸好在这几天学了一下。Git并不难,但会Git至少可以说明一个人的学习能力...
Python3 字符串是编程语言中的基础数据类型,它用于表示文本信息。字符串在Python中是不可变的,这意味着一旦创建了字符串,就不能修改它的内容。以下是对字符串相关知识点的详细说明: 1. 创建字符串: 创建字符...
【描述】:“跟我学习 我学习的东西的文档,以供进一步参考。 该存储库的目的是在不同情况下展示我的学习技巧。 在每个类别内,您都可以找到README.md文件,该文件解释了我在学习,文档和链接时发现的有用内容。” ...
【标题】"跟我一起写大虾网(第3天)" 暗示了这是一个关于编程教程的系列,可能是一个在线课程或博客文章的第三部分,专注于构建一个名为“大虾网”的项目。在这个阶段,作者可能讲解了项目的进一步开发、功能实现或者...
【标题】"跟我一起写大虾网(第2天)"是一个关于编程学习的教程,可能是系列教程的一部分,主要聚焦在代码编写和开发工具的使用上。这个标题暗示了作者将带领读者逐步了解如何构建一个名为“大虾网”的项目,可能是...