代码跑得慢甩锅Python手把手教你如何

大数据文摘出品

来源:Medium

编译:王转转

Python已经得到了全球程序员的喜爱,但是还是遭到一些人的诟病,原因之一就是认为它运行缓慢。

其实某个特定程序(无论使用何种编程语言)的运行速度是快还是慢,在很大程度上取决于编写该程序的开发人员自身素质,以及他们编写优化而高效代码的能力。

Medium上一位小哥就详细讲了讲如何让python提速30%,以此证明代码跑得慢不是python的问题,而是代码本身的问题。

时序分析

在开始进行任何优化之前,我们首先需要找出代码的哪些部分使整个程序变慢。有时程序的问题很明显,但是如果你一时不知道问题出在哪里,那么这里有一些可能的选项:

注意:这是我将用于演示的程序,它将进行指数计算(取自Python文档):

#slow_program.pyfromdecimalimport*defexp(x):getcontext().prec+=2i,lasts,s,fact,num=0,0,1,1,1whiles!=lasts:lasts=si+=1fact*=inum*=xs+=num/factgetcontext().prec-=2return+sexp(Decimal())exp(Decimal())exp(Decimal())

最简约的“配置文件”

首先,最简单最偷懒的方法——Unix时间命令。

~$timepython3.8slow_program.pyreal0m11,suser0m11,ssys0m0,s

如果你只能直到整个程序的运行时间,这样就够了,但通常这还远远不够。

最详细的分析

另外一个指令是cProfile,但是它提供的信息过于详细了。

~$python3.8-mcProfile-stimeslow_program.pyfunctioncalls(primitivecalls)in11.secondsOrderedby:internaltimencallstottimepercallcumtimepercallfilename:lineno(function)..69..slow_program.py:4(exp)10....{built-inmethod_imp.create_dynamic}4/10...11.{built-inmethodbuiltins.exec}60....{built-inmethod__new__oftypeobjectat0x9d12c0}60....abc.py:(__new__)...._weakrefset.py:36(__init__)....{built-inmethodbuiltins.getattr}20....{built-inmethodmarshal.loads}....frozenimportlib._bootstrap_external:(find_spec)8/40....abc.py:(__subclasscheck__)....{built-inmethodposix.stat}60....{built-inmethodbuiltins.__build_class__}10....__init__.py:(namedtuple)....frozenimportlib._bootstrap_external:57(_path_join)....frozenimportlib._bootstrap_external:59(list


转载请注明:http://www.aierlanlan.com/grrz/2334.html