首页 > 编程 > Python > 正文

用Python编写分析Python程序性能的工具的教程

2020-02-23 00:28:53
字体:
来源:转载
供稿:网友

虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题。

分析程序的性能可以归结为回答四个基本问题:

        正运行的多快     速度瓶颈在哪里     内存使用率是多少     内存泄露在哪里

下面,我们将用一些神奇的工具深入到这些问题的答案中去。
用 time 粗粒度的计算时间

让我们开始通过使用一个快速和粗暴的方法计算我们的代码:传统的 unix time 工具。
 

$ time python yourprogram.pyreal 0m1.028suser 0m0.001ssys 0m0.003s

三个输出测量值之间的详细意义在这里 stackoverflow article,但简介在这:

    real — 指的是实际耗时     user — 指的是内核之外的 CPU 耗时     sys — 指的是花费在内核特定函数的 CPU 耗时

你会有你的应用程序用完了多少 CPU 周期的即视感,不管系统上其他运行的程序添加的系统和用户时间。

如果 sys 和 user 时间之和小于 real 时间,然后你可以猜测到大多数程序的性能问题最有可能与 IO wait 相关。
用 timing context 管理器细粒度的计算时间

我们下一步的技术包括直接嵌入代码来获取细粒度的计时信息。下面是我进行时间测量的代码的一个小片段

timer.py
 

import time class Timer(object): def __init__(self, verbose=False): self.verbose = verbose  def __enter__(self): self.start = time.time() return self  def __exit__(self, *args): self.end = time.time() self.secs = self.end - self.start self.msecs = self.secs * 1000 # millisecs if self.verbose:  print 'elapsed time: %f ms' % self.msecs

为了使用它,使用 Python 的 with 关键字和 Timer 上下文管理器来包装你想计算的代码。当您的代码块开始执行,它将照顾启动计时器,当你的代码块结束的时候,它将停止计时器。

这个代码片段示例:
 

from timer import Timerfrom redis import Redisrdb = Redis() with Timer() as t: rdb.lpush("foo", "bar")print "=> elasped lpush: %s s" % t.secs with Timer() as t: rdb.lpop("foo")print "=> elasped lpop: %s s" % t.secs

为了看看我的程序的性能随着时间的演化的趋势,我常常记录这些定时器的输出到一个文件中。
使用 profiler 逐行计时和分析执行的频率

罗伯特·克恩有一个不错的项目称为 line_profiler , 我经常使用它来分析我的脚本有多快,以及每行代码执行的频率:

为了使用它,你可以通过使用 pip 来安装它:
 

pip install line_profiler            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表