当前位置: 技术文章>> Python高性能编程与实战-Python Profile简介

文章标题:Python高性能编程与实战-Python Profile简介
  • 文章分类: 后端
  • 21535 阅读

Profile在Python中被称为监视统计数据组,用来监视Python代码的执行过程。Python中的Profile分为两种类型:一种是CProfile,即基于C语言来操作的Profile;另一种是Profile,即使用Python语言来操作的Profile。CProfile和Profile提供了对Python程序的性能确定性分析。Profile是一组统计数据,描述Python程序各个部分执行的频率和时间。这些统计数据可以通过pstats模块格式化为报表进行查看,如图14-1所示。我们可以通过Profile来分析Python代码,从而了解Python代码中可优化的地方。

性能确定性分析旨在反映这样一个事实:所有函数调用、函数返回和异常事件都被监控,并且对这些事件发生的间隔(在此期间用户编写的代码正在执行)进行精确计时。统计分析(不是由该模块完成)随机采样有效指令指针,并推断时间耗费在哪里。

统计分析传统上涉及较少的开销(因为代码不需要检测),但只提供了时间花在哪里的相对指示。在Python中,由于在执行程序中总有一个活动的解释器,因此执行确定性分析不需要插入指令的代码。Python自动为每个事件提供一个:dfn:钩子(可选回调)。

此外,Python的解释特性往往会给执行增加太多开销,以至于在典型的应用程序中,确定性分析往往只会增加很小的处理开销。结果是,确定性分析代价并没有那么高昂,但是提供了有关Python程序执行的大量运行时统计信息。调用计数统计信息可用于识别代码中的错误(意外计数),并识别可能的内联扩展点(高频调用)。

内部时间统计可用于识别应仔细优化的“热循环”。累积时间统计可用于识别算法选择上的高级别错误。注意,确定性性能分析中对累积时间的异常处理,允许直接比较算法的递归实现与迭代实现的统计信息。

确定性分析存在一个涉及精度的基本问题。其最明显的限制是,底层时钟周期大约为0.001s(通常)。因此,没有什么测量会比底层时钟更精确。如果进行足够的测量,那么误差将趋于平均。不幸的是,删除第一个错误会导致第二个错误发生。

第二个问题是,从调度事件到分析器调用获取时间函数的过程实际上是获取时钟状态,这需要一段时间。类似地,从获取时钟值开始,到再次执行用户代码为止,退出分析器事件句柄也存在一定的延时。因此,多次调用单个函数或多个函数通常会累积延时。尽管这种方式的误差通常小于时钟的精度(小于一个时钟周期),但它可以累积并变得非常可观。

与开销较低的CProfile相比,Profile的问题更为严重。出于这个原因,Profile提供了一种针对指定平台的自我校准方法,以便最大限度(平均地)消除此误差。校准后,结果将更准确(在最小二乘意义上),但它有时会产生负数。但不要对产生的负数惊慌,该情况应该只会在手工校准分析器的情况下出现,实际上结果比没有校准的情况要好。


推荐文章