如何分析 python 程序 cpu 占用率问题

问题

某天我看了一下目前在跑的一个 python 程序的 CPU 利用率,发现跑到了 100%

在这里插入图片描述

这个程序本身执行的任务很多,开启了很多的线程,跑到 100% 也可以说的过去。但是作为程序员的好奇心就被勾引起来了

java 可以通过 “top -Hp + jstack + 代码” 精准定位到 cpu 高利用率的原因。那么在 python 中,通过什么方式可以实现相同的目的?

一、方案调研

经过简单的调研,python 和 java 排查的思路不太一样,有下面三种工具可以使用:cProfile、py-spy、yappi

cProfile py-spy yappi
使用便捷性 无需安装,使用简单(直接导入标准库) 需额外安装,命令行操作,可能需要管理员权限 需额外安装,需在代码中初始化/启动/停止
功能特性 统计函数调用次数、执行时间等基础信息,不支持多线程/异步代码 支持多线程/异步分析,可实时分析运行中的进程,生成火焰图 支持多线程/协程分析,可自定义时钟类型(CPU时间或墙钟时间)
性能影响 对性能有一定影响(大型程序更明显) 非侵入式,对目标进程性能影响极小 性能影响较小,但大规模程序可能有开销
分析结果展示 文本输出(复杂场景难解读) 火焰图可视化,直观定位瓶颈 详细统计数据(需学习成本),支持多种输出格式
适用场景 开发阶段初步性能分析(定位耗时函数) 生产环境实时分析(快速定位CPU高负载问题) 复杂多线程/异步程序深度分析

二、每个工具实际使用的效果

2.1 cProfile

基本使用方式是修改程序的启动入口

import cProfile

def main():
    ...  # 程序入口

if __name__ == "__main__":
    cProfile.run('main()', sort=
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郎碎碎念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值