问题
某天我看了一下目前在跑的一个 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=

最低0.47元/天 解锁文章
1471

被折叠的 条评论
为什么被折叠?



