【跟我学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学习,只要跟的我一步一步走,你还是多少都学到一些东西,上一次我发布第一遍Python实例五角星,今天是发布第二个实例Python蟒蛇,编程也给你们,我也帮你们注释,方便你们更好的理解,只要老老实实敲代码...
第四,所有对windows的垄断的血泪控诉都直接对mathwork转过来吧~什么对开源,对自由,对的打击信仰~绝对适用~第五,python大部分时候如果不比你好用至少跟你一样好用,而这只是它不到10%的功能,几个程序员业余...
我之前也写了一篇关于面向对象编程的博客,两篇博客内容相近,包含了我这两次学习的全部内容 第一篇博客 1. 转义字符 \n:换行 \t:制表符,tab “\”号后面可以跟八进制或者十六进制来表示字符,如\141、\x61表示a ...
比较难知道学校的新书有什么,需要有一个推送新书的程序告诉我,比如说我关注的一个关键词有python,就会在新书出现python关键字的时候给我推送特别关注的新书 3.馆藏空闲通知,有时候,我想要借的书给别人借走...
5月4日 星期二 天气:好 心情:好 先回答问题 当然可以啦!! 我就是课余学习python的呀! 但是在开始还是再三考虑清楚哦 毕竟认真学习好一门计算机语言 其实就跟学习一门外语一样的 一样有很多名词概念要去记 规范...
如果对自然语言分类,有很多中分法,...比如“好”和“人”,两个元素和在一起是“好人”,而3和5和在一起是8,如果你认为是35,那就属于第二类和法了。 把我的这种分法抽象一下: 一种是:△ +□ = ○ 另外一种是:△
无服务器架构的最佳实践全文共14页,当前为第5页。无服务器架构的最佳实践全文共14页,当前为第5页。 无服务器架构的最佳实践全文共14页,当前为第5页。 无服务器架构的最佳实践全文共14页,当前为第5页。 无服务器...
Git是编程中的基本技能之一,互联网公司几乎都在使用Git进行协作编程,昨天还有位禅友在微信上专门告诉我说星期五面试的时候刚好被问到 Git,幸好在这几天学了一下。Git并不难,但会Git至少可以说明一个人的学习能力...
本章我们将会开发基于Struts2框架的Hello World.我们的Hello World程序是你开发基于Struts2框架程序的第一步.这里我们会提供循序渐进的教程来开发基于Struts2框架的Hello World程序. 教程包含基本的步骤像创建目录...
• 第五章:XML实例解释 • 一.定义新标识 • 二.建立XML文档 • 三.建立相应的HTML文件 • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大...
昨天定完计划后,我就开始进入javase的学习过程,我的学习方式分为两块:一块是听视频,做笔记,写博客;另一块:去网上找一些基础的练习题自己巩固巩固。我在上一篇文章中也说到,我对于一些基础的java知识是有一些...
该编码包主要通过我的论文“使用第一性原理方法研究储能系统材料和界面中质子的性质和机理”的第5章。 由于尚未发布任何数据,因此,幸运的是,该论文将在2021年7月左右在线发布。 此编码包的目标 该存储库的目的是...
我编写了一些工具,用于创建数据库的对象-关系映射、描述三维可视化以及在Java源代码中插入性能监控代码。我甚至为一次演讲编写了一个简单的DNA模式匹配程序。 一门语言的正式描述称为语法(grammar),ANTLR能够...