
字段的意义与文本输出根本一致,不过便捷性可以点击字段名排序。左下方列出了当前函数的calller(调用者),右下方是当前函数内部与子函数的时光┞芳用情况。上如是按照cumtime(即该函数内部及其子函数所占的时光和)排序的结不雅。
造成机能瓶颈的原因平日是高频调用的函数、单次消费异常高的函数、或者二者的结合。在我们前面的例子中,foo就属于高频调用的情况,bar属于单次消费异常高的情况,这都是我们须要优化的重点。
python-profiling-tools中介绍了qcachegrind和runsnakerun的应用办法,这两个colorful的对象比visualpytune强大年夜得多。具体的应用办法请参考原文,下图给出test.prof用qcachegrind打开的结不雅。

qcachegrind确切要比visualpytune强大年夜。大年夜上图可以看到,大年夜致分为三部:。第一部分同visualpytune类似,是每个函数占用的时光,个中Incl等同于cumtime, Self等同于tottime。第二部分和第三部分都有很多标签,不合的标签标示大年夜不合的角度来看结不雅,如图上所以,第三部分的“call graph”展示了该函数的call tree并包含每个子函数的时光百分比,一目了然。
profile针对优化
知道了热点,就可以进行针对性的优化,而这个优化往往根具体的营业密切相干,没用全能钥匙,具体问题,具体分析。小我经验而言,最有效的优化是找产品经理评论辩论需求,可能换一种方法也能知足需求,少者稍微调和一下产品经理也能接收。次之是修改代码的实现,比如之前应用了一个比较通俗易懂但效力较低的算法,如不雅这个算法成为了机能瓶颈,那就推敲换一种效力更高然则可能难解得的算法、或者应用dirty Flag模式。对于这些同样的办法,须要结合具体的案例,本文不做赘述。
接下来结合python说话特点,介绍一些让python代码不那么pythonic,但可以晋升机能的一些做法
第一:削减函数的调用层次
- cdef double f(double x): # 返回值也有类型断定
- return x**2-x
- cdef double integrate_f(double a, double b, int N):
- cdef int i
- cdef double s, dx
- s = 0
- dx = (b-a)/N
- for i in range(N):
- s += f(a+i*dx)
- return s * dx
每一层函数调用都邑带来不小的开销,特别对于调用频率高,但单次消费较小的calltree,独裁的函数调用开销就很大年夜,这个时刻可以推敲将颇┞饭开。
对于之前调到的profile的代码,foo这个call tree异常简单,但频率高。修改代码,增长一个plain_foo()函数, 直接返回最终结不雅,关键输出如下:
跟之前的结不雅比较:

可以看到,优化了差不多3倍。
第二:优化属性查找
膳绫擎提到,python 的属性查找效力很低,如不雅在一段代码中频繁拜访一个属性(比如for轮回),那么可以推敲用局部变量代替对象的属性。
- call f cost: 1.19209289551e-06
- call integrate_f cost: 0.187038183212
第三:封闭GC

在本文的第一章节已经提到,封闭GC可以晋升python的机能,GC带来的顿卡在及时性请求比较高的应用处景也是难以接收的。但封闭GC并不是一件轻易的工作。我们知道python的引用计数只能敷衍没有轮回引用的情况,有了轮回引用就须要靠GC来处理。在python说话中, 写出轮回引用异常轻易。比如:
推荐阅读
于IT业内,大年夜数据之火热程度,似乎无出其右者。当然,在颇┞锋正爆发前夕,也应当合时泼盆冷水。谁能接触到数据国内冠以大年夜数据之名的企业数以千计,但细分其专注范畴,大年夜致可>>>详细阅读
本文标题:Python性能优化
地址:http://www.17bianji.com/lsqh/36589.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示