当前位置:首页 > 数码 > 六个技巧-优化Python代码性能! (六种技巧)

六个技巧-优化Python代码性能! (六种技巧)

admin8个月前 (05-08)数码29

很多小同伴们总是会吐槽/target=_blankclass=infotextkey>Python的性能速度慢。但是理想上程序运转速度的快慢都在很大水平上取决于编写程序的开发人员,以及开发人员的算法才干和对代码的优化才干。Python只管在运转效率上有所短少,但是值得一提的是在开发效率方面Python却比其它编程言语高很多。为了补偿Python在运转效率上的无余,所以小编在本文为大家引见优化Python代码性能的技巧。

代码性能检测

在对代码启动优化之前,通常须要检测是哪些代码片段拖慢了整个程序的运转速度。在这里笔者介绍三个方法协助开发者们找出程序的瓶颈,这样就知道应该把留意力放在哪里。

以一个Python成功斐波那契数列的程序为示例:

#斐波那契数列defFibonacci:a,b=0,1i=0whilei<100:print(b)a,b=b,a+bi+=1Fibonacci

经常使用timeit库

timeit模块是Python的内置模块。timeit模块努力于权衡代码的性能,模块内提供了许多个函数和类,以便开发者能够准确地测量代码的口头期间。timeit模块用法较为便捷,适宜用来计算一小段代码的运转期间。

代码示例:

importtimeitdefFibonacci:a,b=0,1i=0whilei<100:print(b)a,b=b,a+bi+=1result=timeit.timeit(Fibonacci,number=5)print(f"Fibonacci函数的运转期间为:{result}")

运转结果:

经常使用memory_profiler库

memory_profiler是Python的第三方库(须要经常使用pip命令启动装置),是一个可依据每行代码检查内存占用的工具。开发者经常使用memory_profiler库可以有效的定位到程序中占有内存最多的代码,以此找到程序运转的瓶颈。

pip命令装置:

代码示例:

frommemory_profilerimportprofile@profiledefFibonacci:a,b=0,1i=0whilei<100:print(b)a,b=b,a+bi+=1Fibonacci

运转结果:

经常使用line_profiler库

和memory_profiler相似,line_profiler也是Python的第三方库,是一个可以逐行参看代码运转耗时的剖析工具。

代码示例:

fromline_profilerimportLineProfilerdefFibonacci:a,b=0,1i=0whilei<100:print(b)a,b=b,a+bi+=1lp=LineProfilerlp_wrap=lp(Fibonacci)lp_wrap#输入统计数据lp.print_stats

运转结果:

接上去就开局引见优化Python代码性能的六个技巧。

经常使用内置函数和库

Python的内置函数和库与咱们罕用的自定义函数、自定义数据类型相比,运转速度会显得十分快。这关键是由于内置数据类型的底层是经常使用C言语成功的,而C言语又是目前为止口头效率最高的初级言语,这是经常使用Python所无法比拟的。而且Python的开发团队也对这些内置函数和库启动了良好的测试和优化。

示例代码:

my_list=[]_list="hello,world"forwordinword_list:my_list.end(word.upper)print(my_list)

更好的方法:

word_list="hello,world"#经常使用内置map函数my_list=map(str.upper,word_list)print(list(my_list))

经常使用内插字符串f-string

在Python程序中,经常使用允许插值的f-string取代C格调的格局字符串与str.format方法,会使得字符串操作效率失掉提高。依据《EffectivePython》一书中的引见,经常使用f-string是个繁复而弱小的机制,它在繁复性、可读性和速度方面都比其余构建字符串的形式要更好。

示例代码:

places=3number=1.23456my_str="number值和places值区分为{0}和{1}".format(number,places)print(my_str)

更好的方法:

places=3number=1.23456my_str=f"number值和places值区分为{number}和{places}"print(my_str)

经常使用列表推导式

在小片段的Python代码中,经常使用列表推导式替代循环语句可以使得代码愈加繁复易读;在大型名目中,相较于经常使用循环语句,经常使用列表推导式的口头效率也会更高。这是由于列表推导式是间接在C言语的环境下运转的,所以速度更快,而循环语句的解析口头往往比列表推导式的步骤更多,所以速度就更慢。

示例代码:

my_list=[]#计算1到100以内的奇数foriinrange(1,100):ifi%2==1:my_list.append(i)print(my_list)

更好的方法:

my_list=[iforiinrange(1,100)ifi%2==1]print(my_list)

六种技巧 经常使用lru_cache装璜器缓存数据

将程序口头时的消息存储在缓存中可以使程序运转的愈加高效。在Python中也可以导入functools库中的lru_cache装璜器来成功缓存操作,该操作会在内存中存储特定类的缓存,以此来到达程序更快的驱动速度。

示例代码:

importtime

defmy_func(x):time.sleep(2)#模拟程序口头期间returnx

print(my_func(1))print("=========")print(my_func(1))

更好的方法:

importfunctoolsimporttime

#最多缓存128个不同的结果@functools.lru_cache(maxsize=2)defmy_func(x):time.sleep(2)#模拟程序口头期间returnx

print(my_func(1))print("=========")print(my_func(1))#结果已被缓存,无需期待立刻前往

针对循环结构的优化

在通常状况下,循环语句在程序中的口头总是会占据少量期间。因此咱们开发Python程序时都会强调优化其中的循环结构,比如说防止在一个循环中经常使用点操作符和不用要的重复操作等。

示例代码:

my_list=[]word_list=["hello,","word"]

forwordinword_list:new_str=str.lower(word)#不用要的重复操作和点运算符my_list.append(new_str)

print(my_list)

更好的方法:

my_list=[]word_list=["hello,","word"]lower=str.lower

forwordinword_list:my_list.append(lower(word))

print(my_list)

选用适宜算法和数据结构

提到代码的运转效率,就不得不提到算法和数据结构才干了。算法也就是程序处置疑问的步骤,而数据结构是指数据的存储和组织。选用适宜的算法和数据结构,可以在很大水平上优化Python代码的运转效率。

示例代码:

#在有序数组中,经常使用二分查找算法查找元素要比经常使用顺序查找算法效率更高defsequential_search(nums,target):fornuminnums:ifnum==target:returnnums.index(num)return-1#前往-1示意没有找到指标元素

nums=[1,8,10,11,22]target=11print(sequential_search(nums,target))

更好的方法:

#二分查找defbinary_search(nums,target):first,last=0,len(nums)-1#定义数组的第一个元素下标和最后一个元素下标whilefirst<=last:#左闭右闭区间mid_index=(first+last)//2#两边元素的下标值

ifnums[mid_index]<target:first=mid_index+1elifnums[mid_index]>target:last=mid_index-1else:returnmid_indexreturn-1

nums=[1,8,10,11,22]target=11print(binary_search(nums,target))

好啦,以上就是小编当蠢才享的六个提高Python代码性能的技巧,宿愿对小同伴们有所协助!

原文链接:


如何对Python进行性能优化

Python的批评者声称Python性能低效、执行缓慢,但实际上并非如此:尝试以下6个小技巧,可以加快Pytho应用程序。 Python是一门非常酷的语言,因为很少的Python代码可以在短时间内做很多事情,并且,Python很容易就能支持多任务和多重处理。 py 1、关键代码可以依赖于扩展包Python使许多编程任务变得简单,但是对于很关键的任务并不总是提供最好的性能。 使用C、C++或者机器语言扩展包来执行关键任务能极大改善性能。 这些包是依赖于平台的,也就是说,你必须使用特定的、与你使用的平台相关的包。 简而言之,该解决方案提供了一些应用程序的可移植性,以换取性能,您可以获得只有通过直接向底层主机编程。 下面这些扩展包你可以考虑添加到你的个人扩展库中:CythonPyInlnePyPyPyrex这些包有不同的作用和执行方式。 例如,Pyrex 让Python处理一些内存任务变得简单高效;PyInline可以直接让你在Python应用程序中使用C代码,虽然内联代码被单独编译,但是如果你能高效的利用C代码,它可以在同一个地方处理每一件事情。 2、使用关键字排序有很多古老的Python代码在执行时将花费额外的时间去创建一个自定义的排序函数。 最好的排序方式是使用关键字和默认的sort()方法,看看下面的示例:import operatorsomelist = [(1, 5, 8), (6, 2, 4), (9, 7, 5)](key=(0))somelist#Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)](key=(1))somelist#Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)](key=(2))somelist#Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],每一个案例的列表是根据你选择作为关键字参数的索引排序的,这种方式对字符串和数字排序同样适用。 3、优化循环每一种编程语言都强调循环语句的优化,Python也是一样的。 尽管你可以依赖于丰富的技术让循环运行的更快,然而,开发者经常忽略的一个方法是避免在循环内部使用点拼接字符串。 对于下面的示例:lowerlist = [this, is, lowercase]upper = = []append = word in lowerlist: append(upper(word)) print(upperlist) #Output = [THIS, IS, LOWERCASE]每一次调用,Python都会去求这个方法的值。 但是如果你把求值的结果放入一个变量中,就能提高程序的性能。 这个关键是减少Python内执行的循环次数,因为Python解析这些实例是比较慢的。 4、使用新版本任何一个在线上搜索Python资料的人都会发现无数关于Python版本迁移的信息。 通常,Python每一个版本都针对之前的一个版本做了优化和改进,以让Python运行的更快。 限制因素是你喜欢的函数库是否也针对Python的新版本做了改进。 当你使用了新的函数库,获得了Python的新版本,你需要保证代码依然能够运行,检查应用,修正差异。 然后,如果你仅仅是保证应用能够在新版本上运行,你可能错过新功能的更新。 一旦你做了改进,在新版本下配置应用程序,检查问题区域并优先使用新功能更新,对于之前的升级,用户将看到更大性能的提升。 5、尝试多种编程方法每一次你创建应用的时候,都使用同一种编程方法,在某些情况下降导致程序运行会比预期的慢。 在分析的过程中做一些小试验。 例如,当管理字典中的数据项时,可以采用安全的方法确定数据项是否已经存在并需要更新它,或者你可以直接添加条目,然后处理项目根本不存在的情况。 n = 16myDict = {}for i in range(0, n): char = abcd[i%4] if char not in myDict: myDict[char] = 0 myDict[char] += 1 print(myDict)当myDict是空时,上述的代码通常会运行的更快。 但当myDict已经有数据填充时,就有更好的方法可以选择:n = 16myDict = {}for i in range(0, n): char = abcd[i%4] try: myDict[char] += 1 except KeyError: myDict[char] = 1 print(myDict)两种情况下都输出{d: 4, c: 4, b: 4, a: 4},唯一的差异是输出是怎么获得的。 站在盒子外考虑和创建新的编程技巧都能让你的程序获得更快的运行速度。 6、交叉编译程序 开发者有时会忘记计算机不能识别任何一种现在应用程序语言,它只识别机器代码。 为了运行程序,需要一个应用将人类可读的代码转换成计算机能识别的代码。 当用一种语言写程序时,例如Python,然后用另外一种语言来运行它,例如C++,从性能角度看是有道理的。 这个取决于你想要用这个应用做什么和主机系统能够提供什么资源。 一个有趣的交叉编译器,Nuitka, 能将Python转换成C++代码,结果是你可以再本机模式下执行应用,而不是依赖于解释器。 根据平台和任务中,你可以看到显著的性能提高。

Python开发学习的必备技能

使用Python开发语言进行项目开发,编写代码数量要少一些,并且代码短而可读,在团队开发中读取代码的速度会更加快,提高工作效率。优雅的开发不再是梦想,因此Python语言成为最流行的编程语言之一,现在更多的人选择Python语言。下面昆明UI设计为大家介绍Python开发学习的必备技能。

一、排序时使用键

创建自定义顺序时,存在大量旧的分类代码,但您可以在运行时加快排序过程。云南java培训认为排序项的最佳方法是使用键排序方法(密钥)和默认排序方法。

二、让关键代码依赖于外部包

外部软件包可以通过多种方法提高性能。其中主要有Pyrex使用C的数据类型,可以扩展Python能够执行更有效的或直接的内存任务,并且PyInIne允许在Python应用程序中直接使用C代码。云南java课程发现程序中的内联代码被单独编译,一边利用C语言能够提供的效率,一边能够将所有的代码放在同一个地方。

三、交叉编译应用程序

有趣的交叉编译器Nuitka将Python代码转换为C代码。其结果,不是依赖于解释程序,而是在本地模式下运行应用程序。基于平台、任务和性能有了飞跃性的提高。

四、优化循环

在每个编程语言中,必须强调需要进行优化循环。优化周期的关键是减少Python语言在循环中执行的工作量。因为java课程培训机构发现Python的本地解释器在这种情况下能够减缓执行速度。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Python

“六个技巧-优化Python代码性能! (六种技巧)” 的相关文章

Python中的LEGB规则 (python怎样打开)

Python中的LEGB规则 (python怎样打开)

Python 中的 LEGB 规则决定了变量和函数的作用域解析顺序。它代表了四个作用域层级: 局部作用域 闭包函数外的函数 全局作用域 内置作用域...

b-b-个入门建议!-Python-技术书籍推荐-附赠-11 (b+b+b等于什么)

b-b-个入门建议!-Python-技术书籍推荐-附赠-11 (b+b+b等于什么)

近年来,Python 持续火爆,越来越多的人开始入门学习 Python。RealPython 作为最受好评的 Python 学习网站,拥有超百万的浏览量,以下是 RealPython 的开发者给...

处置日常义务的终极工具!-Python-文件读写实战 (处置行为是什么意思)

处置日常义务的终极工具!-Python-文件读写实战 (处置行为是什么意思)

/target=_blankclass=infotextkey>Python文件的读写操作时,有很多须要思考的细节,这包含文件关上形式、读取和写入数据的方法、意外处置等。 在本文中,...

惰性求值和lambda表达式的强大组合-Python高级技巧 (惰性求值和逻辑短路)

惰性求值和lambda表达式的强大组合-Python高级技巧 (惰性求值和逻辑短路)

Lambda 表达式 在 Python 中,Lambda 表达式是一个匿名函数,它可以在需要函数对象的地方使用。Lambda 表达式的语法如下: lambda arguments: exp...

一份收藏者必备清单-100个精选Python库 (收藏者的心态)

一份收藏者必备清单-100个精选Python库 (收藏者的心态)

/target=_blankclass=infotextkey>Python为啥这么火,这么多人学,就是由于繁难好学,性能弱小,整个社区十分生动,资料很多。而且这言语触及了方方面面,比如智能...

生成-UUID-操作-Python-齐全指南-格局和经常出现疑问 (生成uuid java)

生成-UUID-操作-Python-齐全指南-格局和经常出现疑问 (生成uuid java)

UUID(UniversallyUniqueIdentifier,通用惟一标识符)是一种全局惟一标识符生成形式,用于创立举世无双的标识符。/target=_blankclass=infotextk...

五分钟内完成个性化-GUI-计算器搭建-Python (五分钟内完成的动物实验)

五分钟内完成个性化-GUI-计算器搭建-Python (五分钟内完成的动物实验)

这个简单的教程将指导你如何在 Python 中使用 Tkinter 轻松制作一个全功能的 GUI 计算器。 7 8...

网络-摸索Python中的必备模块-解锁数据处置-迷信计算等畛域的弱小工具-自动化 (网络mod)

网络-摸索Python中的必备模块-解锁数据处置-迷信计算等畛域的弱小工具-自动化 (网络mod)

/target=_blankclass=infotextkey>Python罕用的模块十分多,关键分为内置模块和第三方模块两大类,且不同模块运行场景不同又可以分为文本类、数据结构类、数学运算...