ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:57.48KB ,
资源ID:26251401      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26251401.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Python代码性能优化技巧.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Python代码性能优化技巧.docx

1、Python代码性能优化技巧代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的、优化、扩展以及文档相关的事情通常需要消耗 80% 的工作量。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。改进算法,选择合适的数据结构一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进。在算法的时间复杂度排序上依次是:O(1) - O(lg n) - O(n lg n) - O(n2) - O(n3) - O(nk) - O(kn) - O(n!)因此如果能够在时间复杂度上对算法进行一定的改进,对性能的提高不言

2、而喻。但对具体算法的改进不属于本文讨论的范围,读者可以自行参考这方面资料。下面的内容将集中讨论数据结构的选择。字典 (dictionary) 与列表 (list)Python 字典中使用了 hash table,因此查找操作的复杂度为 O(1),而 list 实际是个数组,在 list 中,查找需要遍历整个 list,其复杂度为 O(n),因此对成员的查找访问等操作字典要比 list 更快。清单 1. 代码 from time import time t = time() list = a,b,is,python,jason,hello,hill,with,phone,test, dfdf,a

3、pple,pddf,ind,basic,none,baecr,var,bana,dd,wrd #list = (list,True) print list filter = for i in range (1000000): for find in is,hat,new,list,old,.: if find not in list: (find) print total run time: print time()-t上述代码运行大概需要 。如果去掉行 #list = (list,True) 的注释,将 list 转换为字典之后再运行,时间大约为 seconds,效率大概提高了一半。因此在需

4、要多数据成员进行频繁的查找或者访问的时候,使用 dict 而不是 list 是一个较好的选择。集合 (set) 与列表 (list)set 的 union, intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集, 并集或者差的问题可以转换为 set 来操作。清单 2. 求 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 (10000

5、00): for a in lista: for b in listb: if a = b: (a)print total run time: print time()-t上述程序的运行时间大概为:total run time:清单 3. 使用 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 ru

6、n time: print time()-t改为 set 后程序的运行时间缩减为 ,提高了 4 倍多,运行时间大大缩短。读者可以自行使用表 1 其他的操作进行测试。表 1. set 常见用法语法 操作 说明set(list1) | set(list2) union 包含 list1 和 list2 所有数据的新集合set(list1) & set(list2) intersection 包含 list1 和 list2 中共同元素的新集合set(list1) set(list2) difference 在 list1 中出现但不在 list2 中出现的元素的集合对循环的优化对循环的优化所遵循的

7、原则是尽量减少循环过程中的计算量,有多重循环的尽量将内层的计算提到上一层。 下面通过实例来对比循环优化后所带来的性能的提高。程序清单 4 中,如果不进行循环优化,其大概的运行时间约为 。清单 4. 为进行循环优化前from time import time t = time() lista = 1,2,3,4,5,6,7,8,9,10 listb =, for i in range (1000000): for a in range(len(lista): for b in range(len(listb): x=listaa+listbb print total run time: prin

8、t time()-t现在进行如下优化,将长度计算提到循环外,range 用 xrange 代替,同时将第三层的计算 listaa 提到循环的第二层。清单 5. 循环优化后from time import time t = time() lista = 1,2,3,4,5,6,7,8,9,10 listb =, len1=len(lista) len2=len(listb) for i in xrange (1000000): for a in xrange(len1): temp=listaa for b in xrange(len2): x=temp+listbb print total r

9、un time: print time()-t上述优化后的程序其运行时间缩短为 。在清单 4 中 listaa 被计算的次数为 1000000*10*10,而在优化后的代码中被计算的次数为 1000000*10,计算次数大幅度缩短,因此性能有所提升。充分利用 Lazy if-evaluation 的特性python 中条件表达式是 lazy evaluation 的,也就是说如果存在条件表达式 if x and y,在 x 为 false 的情况下 y 表达式的值将不再计算。因此可以利用该特性在一定程度上提高程序效率。清单 6. 利用 Lazy if-evaluation 的特性from ti

10、me import time t = time() abbreviations = cf., ., ex., etc., fig., ., Mr., vs. for i in range (1000000): for w in (Mr., Hat, is, chasing, the, black, cat, .): if w in abbreviations: #if w-1 = . and w in abbreviations: pass print total run time: print time()-t在未进行优化之前程序的运行时间大概为 ,如果使用注释行代替第一个 if,运行的时间

11、大概为 。字符串的优化python 中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象,而不是基于原字符串,因此这种持续的 copy 会在一定程度上影响 python 的性能。对字符串的优化也是改善性能的一个重要的方面,特别是在处理文本较多的情况下。字符串的优化主要集中在以下几个方面:1、在字符串连接的使用尽量使用 join() 而不是 +:在代码清单 7 中使用 + 进行字符串连接大概需要 s,而使用 join 缩短为 。因此在字符的操作上 join 比 + 要快,因此要尽量使用 join 而不是 +。清单 7. 使用 join 而不是 + 连接字符串

12、from time import timet = time() s = list = a,b,b,d,e,f,g,h,i,j,k,l,m,n for i in range (10000): for substr in list: s+= substr print total run time: print time()-t同时要避免:s = for x in list: s += func(x)而是要使用:slist = func(elt) for elt in somelist s = .join(slist)2、当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。如 (),

13、(),(x, yz),(x, yz)3、对字符进行格式化比直接串联读取要快,因此要使用 out = %s%s%s%s % (head, prologue, query, tail)而避免out = + head + prologue + query + tail + 使用列表解析(list comprehension)和生成器表达式(generator expression)列表解析要比在循环中重新构建一个新的 list 更为高效,因此我们可以利用这一特性来提高运行的效率。from time import time t = time() list = a,b,is,python,jason,h

14、ello,hill,with,phone,test, dfdf,apple,pddf,ind,basic,none,baecr,var,bana,dd,wrd total= for i in range (1000000): for w in list: (w) print total run time: print time()-t使用列表解析:for i in range (1000000): a = w for w in list上述代码直接运行大概需要 17s,而改为使用列表解析后 ,运行时间缩短为 。将近提高了一半。生成器表达式则是在 中引入的新内容,语法和列表解析类似,但是在大数据

15、量处理时,生成器表达式的优势较为明显,它并不创建一个列表,只是返回一个生成器,因此效率较高。在上述例子上中代码 a = w for w in list 修改为 a = (w for w in list),运行时间进一步减少,缩短约为 。其他优化技巧1、如果需要交换两个变量的值使用 a,b=b,a 而不是借助中间变量 t=a;a=b;b=t; from timeit import Timer Timer(t=a;a=b;b=t,a=1;b=2).timeit() Timer(a,b=b,a,a=1;b=2).timeit()2、在循环的时候使用 xrange 而不是 range;使用 xrang

16、e 可以节省大量的系统内存,因为 xrange() 在序列中每次调用只产生一个整数元素。而 range() 將直接返回完整的元素列表,用于循环时会有不必要的开销。在 python3 中 xrange 不再存在,里面 range 提供一个可以遍历任意长度的范围的 iterator。3、使用局部变量,避免”global” 关键字。python 访问局部变量会比全局变量要快得多,因 此可以利用这一特性提升性能。4、if done is not None 比语句 if done != None 更快,读者可以自行验证;5、在耗时较多的循环中,可以把函数的调用改为内联的方式;6、使用级联比较 “x y

17、z” 而不是 “x y and y pypy Python (0e28b379d8b3, Feb 09 2012, 18:31:47) PyPy with MSC 32 bit on win32 Type help, copyright, credits or license for more information. And now for something completely different: PyPy is vast, and contains multitudes 以清单 5 的循环为例子,使用 python 和 pypy 分别运行,得到的运行结果分别如下:C:Document

18、s and SettingsAdministrator 桌面 docpythonpypy total run time: C:Documents and SettingsAdministrator 桌面 docpythonpython total run time: 可见使用 pypy 来编译和运行程序,其效率大大的提高。CythonCython 是用 python 实现的一种语言,可以用来写 python 扩展,用它写出来的库都可以通过 import 来载入,性能上比 python 的快。cython 里可以载入 python 扩展 ( 比如 import math),也可以载入 c 的库的

19、头文件 ( 比如 :cdef extern from “”),另外也可以用它来写 python 代码。将关键部分重写成 C 扩展模块Linux Cpython 的安装:第一步:下载rootv5254085f259 cpython# wget -N release/ -2012-04-16 22:08:35- release/ Resolving . Connecting to | connected. HTTP request sent, awaiting response. 200 OK Length: 2200299 application/zip Saving to: 100%= 2,2

20、00,299 s in 2012-04-16 22:08:37 MB/s) - saved 2200299/2200299第二步:解压rootv5254085f259 cpython# unzip -o 第三步:安装python install安装完成后直接输入 cython,如果出现如下内容则表明安装成功。rootv5254085f259 cythonCython is a compiler for code written in theCython language. Cython is based on Pyrex by Greg Ewing. Usage: cython options

21、 sourcefile.pyx,py . Options: -V, -version Display version number of cython compiler -l, -create-listing Write error messages to a listing file -I, -include-dir Search for include files in named directory (multiple include directories are allowed). -o, -output-file Specify name of generated C file -t, -timestamps Only compile newer source files -f, -force Compile all source files (overrides

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1