简介:Py-Spy是Python程序的抽样分析器,支持可视化查看Python程序在哪些地方花了更多时间,能够生成程序运行火焰图,实时显示函数占用等,是分析和优化Python代码的神兵利器。
历史攻略:
代码质量管理平台SonarQube:002 - sonar-scanner扫描python代码
安装:
pip install py-spy
检查安装结果:py-spy -h
py-spy -h
py-spy 0.3.14
Sampling profiler for Python programs
USAGE:
py-spy <SUBCOMMAND>
OPTIONS:
-h, --help Print help information
-V, --version Print version information
SUBCOMMANDS:
record Records stack trace information to a flamegraph,
speedscope or raw file
top Displays a top like view of functions consuming CPU
dump Dumps stack traces for a target program to stdout
help Print this message or the help of the given subcommand(s)
参数解析:
record:生成火焰图
top:实时查看每个函数运行时间并统计
dump:显示每个python线程的当前调用堆栈
被测服务源码:
# -*- coding: utf-8 -*-
# time: 2023/3/10 0:22
# file: main.py
# 公众号: 玩转测试开发
from sanic import Sanic
from sanic.response import json
app = Sanic(__name__)
@app.get("/")
async def hello(request):
return json({"hello": "world"})
if __name__ == '__main__':
app.run(port=7000)
运行程序:运行一个sanic服务。会展示出一个pid,在运行期间,使用py-spy分析代码。
Starting worker [23080]
python main.py
运行监控:
py-spy record -o profile.svg --pid 23080
运行效果图:
火焰图效果展示:
从图中可知,第18行代码最耗时(因为只运行了一个run这个方法)。
将鼠标光标挪到相应具体示例,往下剖析,我们发现:
占用程序运行耗时比较高的为:_poll (asyncio\windows_events.py:783),占用接近75%
综上:安装完成后,先运行一个程序,然后使用py-spy传入相应的pid,即可一步步分析性能,分析存储的火焰图效果,解析代码耗时行为。进而最终进行性能优化。