算法工程师必备技能Python 优化提速小技巧.docx
《算法工程师必备技能Python 优化提速小技巧.docx》由会员分享,可在线阅读,更多相关《算法工程师必备技能Python 优化提速小技巧.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、算法工程师必备技能(Python优化提速小技巧)代码优化原那么本文会介绍不少的Python代码加速运行的技巧。在深化代码优化细节之前需要解析一些代码优化根本原那么。第一个根本原那么是不要过早优化。很多人一开场写代码就奔着性能优化的目的“让正确的程序更快要比让快速的程序正确容易得多。因此优化的前提是代码能正常工作。过早地进展优化可能会无视对总体性能指标的把握在得到全局结果前不要主次颠倒。第二个根本原那么是权衡优化的代价。优化是有代价的想解决所有性能的问题是几乎不可能的。通常面临的选择是时间换空间或者空间换时间。另外开发代价也需要考虑。第三个原那么是不要优化那些无关紧要的局部。假如对代码的每一局部
2、都去优化这些修改会使代码难以浏览以及理解。假如你的代码运行速度很慢首先要找到代码运行慢的位置通常是内部循环专注于运行慢的地方进展优化。在其他地方一点时间上的损失没有什么影响。全局变量很耗时#不推荐写法。代码耗时26.8秒importmathsize10000forxinrange(size):foryinrange(size):zmath.sqrt(x)math.sqrt(y)许多程序员刚开场会用Python语言写一些简单的脚本当编写脚本时通常习惯了直接将其写为全局变量例如上面的代码。但是由于全局变量以及部分变量实现方式不同定义在全局范围内的代码运行速度会比定义在函数中的慢不少。通过将脚本语句
3、放入到函数中通常可带来15%-30%的速度提升。#推荐写法。代码耗时20.6秒importmathdefmain():#定义到函数中以减少全部变量使用size10000forxinrange(size):foryinrange(size):zmath.sqrt(x)math.sqrt(y)main().很耗时防止模块以及函数属性访问#不推荐写法。代码耗时14.5秒importmathdefcomputeSqrt(size:int):resultforiinrange(size):result.append(math.sqrt(i)returnresultdefmain():size10000f
4、or_inrange(size):resultcomputeSqrt(size)main()每次使用.属性访问操作符时会触发特定的方法如_getattribute_()以及_getattr_()这些方法会进展字典操作因此会带来额外的时间开销。通过fromimport语句可以消除属性访问。#第一次优化写法。代码耗时10.9秒frommathimportsqrtdefcomputeSqrt(size:int):resultforiinrange(size):result.append(sqrt(i)#防止math.sqrt的使用returnresultdefmain():size10000for_
5、inrange(size):resultcomputeSqrt(size)main()部分变量的查找会比全局变量更快因此对于频繁访问的变量sqrt通过将其改为部分变量可以加速运行。#第二次优化写法。代码耗时9.9秒importmathdefcomputeSqrt(size:int):resultsqrtmath.sqrt#赋值给部分变量foriinrange(size):result.append(sqrt(i)#防止math.sqrt的使用returnresultdefmain():size10000for_inrange(size):resultcomputeSqrt(size)main(
6、)除了math.sqrt外computeSqrt()函数中还有.的存在那就是调用list的append方法。通过将该方法赋值给一个部分变量可以彻底消除computeSqrt()函数中for循环内部的.使用。#推荐写法。代码耗时7.9秒importmathdefcomputeSqrt(size:int):resultappendresult.appendsqrtmath.sqrt#赋值给部分变量foriinrange(size):append(sqrt(i)#防止result.append以及math.sqrt的使用returnresultdefmain():size10000for_inran
7、ge(size):resultcomputeSqrt(size)main()防止类内属性访问#不推荐写法。代码耗时10.4秒importmathfromtypingimportListclassDemoClass:def_init_(self,value:int):self._valuevaluedefcomputeSqrt(self,size:int)-Listfloat:resultappendresult.appendsqrtmath.sqrtfor_inrange(size):append(sqrt(self._value)returnresultdefmain():size10000
8、for_inrange(size):demo_instanceDemoClass(size)resultdemo_instanceputeSqrt(size)main()防止.的原那么也适用于类内属性访问self._value的速度会比访问一个部分变量更慢一些。通过将需要频繁访问的类内属性赋值给一个部分变量可以提升代码运行速度。#推荐写法。代码耗时8.0秒importmathfromtypingimportListclassDemoClass:def_init_(self,value:int):self._valuevaluedefcomputeSqrt(self,size:int)-List
9、float:resultappendresult.appendsqrtmath.sqrtvalueself._valuefor_inrange(size):append(sqrt(value)#防止self._value的使用returnresultdefmain():size10000for_inrange(size):demo_instanceDemoClass(size)demo_instanceputeSqrt(size)main()防止不必要的抽象#不推荐写法代码耗时0.55秒classDemoClass:def_init_(self,value:int):self.valueval
10、uepropertydefvalue(self)-int:returnself._valuevalue.setterdefvalue(self,x:int):self._valuexdefmain():size1000000foriinrange(size):demo_instanceDemoClass(size)valuedemo_instance.valuedemo_instance.valueimain()任何时候当你使用额外的处理层比方装饰器、属性访问、描绘器去包装代码时都会让代码变慢。大局部情况下需要重新进展审视使用属性访问器的定义是否有必要使用getter/setter函数对属性进
11、展访问通常是C/C程序员遗留下来的代码风格。假如真的没有必要就使用简单属性。#推荐写法代码耗时0.33秒classDemoClass:def_init_(self,value:int):self.valuevalue#防止不必要的属性访问器defmain():size1000000foriinrange(size):demo_instanceDemoClass(size)valuedemo_instance.valuedemo_instance.valueimain()防止数据复制毫无意义的数据复制#不推荐写法代码耗时6.5秒defmain():size10000for_inrange(siz
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法工程师必备技能Python 优化提速小技巧 算法 工程师 必备 技能 Python 优化 提速 技巧
限制150内