写点什么

Python 性能分析利器 pyinstrument 讲解

作者:曲鸟
  • 2022 年 7 月 07 日
  • 本文字数:1333 字

    阅读完需:约 4 分钟

一、前言

程序的性能也是非常关键的指标,很多时候你的代码跑的快,更能够体现你的技术。最近发现很多小伙伴在性能分析的过程中都是手动打印运行时间的方式来统计代码耗时的:

import datetimestart=datetime.datetime.now()b=[i for i in range(10000000)]  # 生成长度为一千万的列表end=datetime.datetime.now()print(end-start)
复制代码

输出结果

0:00:00.377766
复制代码



这种方法使用很快捷,但需要统计每行代码的执行时间,生成可视化的报告等更完善的性能分析时就有点力不从心了。这个时候可以使用 python 的第三方库Pyinstrument来进行性能分析


二、Pyinstrument 使用

Pyinstrument 是一个 Python 分析器。分析器是一种帮助您优化代码的工具 - 使其更快。要获得最大的速度提升。Pyinstrument 官方文档:pyinstrument

Pyinstrument 安装:

pip install pyinstrument


1. 举例

对于最开始我们举的例子,使用 Pyinstrument 实现的代码如下:

from pyinstrument import Profilerprofiler=Profiler()profiler.start()b=[i for i in range(10000000)]# 生成长度为一千万的列表profiler.stop()profiler.print()
复制代码



输出结果

  _     ._   __/__   _ _  _  _ _/_   Recorded: 10:39:54  Samples:  1 /_//_/// /_\ / //_// / //_'/ //     Duration: 0.385     CPU time: 0.391/   _/                      v4.1.1
Program: D:/code/server/aitestdemo/test2.py
0.385 <module>  test2.py:2  #执行总耗时└─ 0.385 <listcomp>  test2.py:7 #单行代码耗时
复制代码



打印的信息包含了记录时间、线程数、总耗时、单行代码耗时、CPU 执行时间等信息。


在多行代码分析的情况下的使用效果(分别统计生成一千万长度、一亿长度、两亿长度的列表耗时):

from pyinstrument import Profiler
profiler = Profiler()profiler.start()a = [i for i in range(10000000)]  # 生成长度为一千万的列表b = [i for i in range(100000000)]  # 生成长度为一亿的列表c = [i for i in range(200000000)]  # 生成长度为十亿的列表profiler.stop()profiler.print()
复制代码



输出结果

Program: D:/code/server/aitestdemo/test2.py
16.686 <module>  test2.py:1├─ 12.178 <listcomp>  test2.py:9├─ 4.147 <listcomp>  test2.py:8└─ 0.358 <listcomp>  test2.py:7
复制代码



2. Pyinstrument 分析 django 代码

使用 Pyinstrument 分析 Django 代码非常简单,只需要在 Django 的配置文件settings.pyMIDDLEWARE 中添加如下配置:

MIDDLEWARE = [ ...    'pyinstrument.middleware.ProfilerMiddleware', ...]
复制代码



然后就可以在 url 上加一个参数 profile 就可以:



Pyinstrument 还支持 flask、异步代码的性能分析,具体可以查看官方文档进行学习。Pyinstrument 也提供了丰富的 api 供我们使用,官网文档有详细的介绍:https://pyinstrument.readthedocs.io/en/latest/reference.html


三、Pyinstrument 与 cProfile(python 自带性能分析器)的不同

根据官方文档的描述来看,Pyinstrument 的系统开销会比 cProfile 这类跟踪分析器小很多,cProfile 由于大量调用探查器,可能会扭曲测试结果:



发布于: 刚刚阅读数: 6
用户头像

曲鸟

关注

还未添加个人签名 2022.07.01 加入

还未添加个人简介

评论

发布
暂无评论
Python性能分析利器pyinstrument讲解_Python_曲鸟_InfoQ写作社区