Python是一门优秀的语言,可以让你用极少的代码量在短时间内完成很多操作。不仅如此,它还轻松支持多任务处理,比如multiprocessing。不喜欢Python的人经常抱怨Python太慢了。但事实并非如此。尝试这六个技巧来加速您的Python应用程序。技巧一:关键代码使用外部包Python简化了许多编程任务,但对于一些时间敏感的任务,其性能往往不尽人意。使用C/C++或机器语言的外部函数包来处理时间敏感的任务,可以有效提高应用程序的运行效率。这些功能包往往是依附于特定平台的,所以你要根据自己使用的平台选择合适的功能包。简而言之,此技巧要求您牺牲应用程序的可移植性来换取只能通过直接对底层主机编程才能获得的操作效率。以下是一些您可以选择以提高效率的包:CythonPylnlnePyPyPyrex这些包有不同的用途。例如,使用C数据类型可以使涉及内存操作的任务更高效或更直观。Pyrex可以帮助Python扩展这些功能。Pylnline使您能够直接在Python应用程序中使用C代码。内联代码是单独编译的,但它将所有编译后的文件保存在某个地方,并利用了C提供的效率。技巧二:排序时使用keyPython包含很多古老的排序规则,这些规则会在你创建自定义排序方法时花费大量时间,而且这些排序方法在运行时也会减慢程序的实际运行速度。最好的排序方法实际上是通过内置的sort()方法使用尽可能多的键。例如,采用以下代码:importoperatorsomelist=[(1,5,8),(6,2,4),(9,7,5)]somelist.sort(key=operator.itemgetter(0))somelist#输出=[(1,5,8),(6,2,4),(9,7,5)]somelist.sort(key=operator.itemgetter(1))somelist#Output=[(6,2,4),(1,5,8),(9,7,5)]somelist.sort(key=operator.itemgetter(2))somelist#Output=[(6,2,4),(9,7,5),(1,5,8)],在每个例子中,列表都是根据你选择的作为关键参数的索引进行排序的。该方法不仅对数值类型有效,对字符串类型也有效。技巧3:循环优化每种编程语言都强调优化循环解决方案。在使用Python时,您可以使用大量技巧来使循环程序运行得更快。然而,开发人员经常忘记的一个技巧是尽量避免在循环中访问变量的属性。例如,采用以下代码:lowerlist=['this','is','lowercase']upper=str.upperupperlist=[]append=upperlist.appendforwordinlowerlist:append(upper(word))print(upperlist)#Output=['THIS','IS','LOWERCASE']每次调用str.upper时,Python都会计算这个公式的值。然而,如果你将这个评估分配给一个变量,那么评估的结果就可以提前知道,Python程序可以运行得更快。因此,关键是尽量减少Python在循环中所做的工作量。由于Python解释执行的性质,它会在上面的示例中大大减慢它的速度。(注:优化循环的方法有很多,这只是其中的一种。比如很多程序员会认为列表推导是唯一可以加快循环的方法。优化循环的关键是提高循环的速度应用程序。一个不错的选择。)技巧4:使用较新版本的Python如果您在Internet上搜索Python,您会发现无数关于如何升级Python版本的信息。通常,每个版本的Python都包含使其运行速度比以前版本更快的优化。但是,限制因素是您最喜欢的库是否已更新以支持新的Python版本。与其争论库是否应该更新,关键在于新的Python版本是否足够高效以支持更新。您必须确保您的代码仍然可以在新版本中运行。您需要使用新的库来体验新的Python版本,然后在进行关键更改时需要检查您的应用程序。只有在进行了必要的更正之后,您才会体会到新版本的不同之处。但是,如果您只是确保您的应用程序在新版本中工作,您很可能会错过新版本提供的新功能。一旦您决定更新,请分析您的应用在新版本下的性能,检查可能存在问题的部分,然后先将新版本的功能应用到这些部分。只有这样,用户才能在更新之初就感知到应用性能的提升。提示#5:尝试多种编码方法每次创建应用程序时都使用相同的编码方法几乎总是会导致应用程序无法像您希望的那样高效运行。在程序分析过程中可以尝试一些实验方法。例如,在处理字典中的数据项时,可以使用安全的方法确保数据项在更新之前已经存在,也可以直接更新数据项,将不存在的数据项单独作为特例处理。请看下面第一段代码:n=16myDict={}foriinrange(0,n):char='abcd'[i%4]ifcharnotinmyDict:myDict[char]=0myDict[char]+=1print(myDict)当myDict最初为空时,这段代码运行得更快。然而,通常情况下,myDict会填满数据,至少是其中的大部分,另一种方法会更有效。n=16myDict={}foriinrange(0,n):char='abcd'[i%4]try:myDict[char]+=1exceptKeyError:myDict[char]=1print(myDict)在两种方法中输出结果是一样的。不同之处在于如何获得输出。跳出框框思考并创造新的编程技术可以使您的应用程序更加高效。技巧六:交叉编译您的应用程序开发人员有时会忘记计算机实际上并不理解用于创建现代应用程序的编程语言。计算机理解机器语言。为了运行您的应用程序,您使用应用程序将您编写的人类可读代码转换为机器可读代码。有时,您使用Python等语言编写应用程序并使用C++等语言运行应用程序,从运行时的角度来看这很好。关键在于您希望您的应用程序完成什么以及您的主机系统可以提供什么资源。Nuitka是一个有趣的交叉编译器,可以将您的Python代码转换为C++代码。这样,您可以在本机模式下执行您的应用程序,而无需依赖解释器程序。您会发现您的应用程序运行效率更高,但这会因平台和任务而异。(注:Nuitka目前还处于内测阶段,实际应用中请多加注意,其实目前还是用于实验。另外,交叉编译是否是提高运行效率的最佳方式,目前还不得而知.有讨论的余地.开发人员多年来一直使用交叉编译来提高应用程序的速度.请记住,每种解决方案都有利有弊,请在生产环境中使用前仔细权衡.)当使用交叉编译时编译使用浏览器时,请确保它支持您正在使用的Python版本。Nuitka支持Python2.6、2.7、3.2和3.3。为了使解决方案起作用,您需要一个Python解释器和一个C++编译器。Nuitka支持许多C++编译器,包括MicrosoftVisualStudio、MinGW和Clang/LLVM。交叉编译会导致一些严重的问题。例如,在使用Nuitka时,你会发现即使是一个小程序也会占用巨大的驱动空间。因为Nuitka使用一系列动态链接库(DDL)来执行Python功能。因此,如果您使用的系统资源非常有限,这种方法可能不可行。结论上述六个技巧都可以帮助您创建运行更高效的Python应用程序。但没有灵丹妙药。上述技巧不一定每次都奏效。在特定版本的Python下,某些技巧可能比其他技巧表现更好,但这有时甚至取决于平台差异。您需要分析您的应用程序,找出它的低效之处,然后尝试这些技巧来找到解决问题的最佳方法。
