首页 存档 技术 查看内容

Python 性能分析入门指南

2018-3-30 13:00 |来自: 互联网 300 0

摘要: (点击上方公众号,可快速关注) 英文:Huy Nguyen 译文:yexiaobai 链接:segmentfault.com/a/1190000000616798 虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时 ...

(点击上方公众号,可快速关注)


英文:Huy Nguyen

译文:yexiaobai

链接:segmentfault.com/a/1190000000616798


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


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


  1. 正运行的多快

  2. 速度瓶颈在哪里

  3. 内存使用率是多少

  4. 内存泄露在哪里


下面,我们将用一些神奇的工具深入到这些问题的答案中去。


用 time 粗粒度的计算时间


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


$ time python yourprogram.py

real0m1.028s

user0m0.001s

sys 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 Timer

from redis import Redis

rdb = Redis()

with Timer() as t:

rdb.lpush("foo", "bar")

print "=

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部