vscode本身不提供内置性能分析功能,需调用cprofile、py-spy或line_profiler等外部工具:cprofile+snakeviz适合函数级热点分析;py-spy适用于运行中进程采样;pocketpy需专用--profile参数;所有结果均需手动保存,且应重点关注self time与调用次数而非平均耗时。

VSCode 本身不运行性能分析,它只负责调用 cProfile、py-spy 或 line_profiler 这类工具,并把结果展示出来。直接点“分析”按钮是没反应的——得手动走命令或配置调试参数。
用 cProfile + snakeviz 快速看函数级热点
这是最稳、最轻量的组合,不用改代码,适合大多数脚本场景。
- 在 VSCode 集成终端里运行:
python -m cProfile -o profile.out your_script.py - 安装可视化工具:
pip install snakeviz - 生成并打开报告:
snakeviz profile.out(会自动在浏览器弹出火焰图) -
cProfile只统计函数调用开销,对循环内部单行耗时不展开;若需行级数据,换line_profiler,配合%lprun在 IPython 里用 - 注意:生成的
profile.out是二进制文件,别用文本编辑器打开;也别直接双击——必须用snakeviz解析
用 py-spy 分析正在运行的 Python 进程
适合无法重启、卡死、或已部署的服务,比如 Flask 后端、爬虫长时间运行等场景。
- 先查进程 ID:
ps aux | grep python,找到目标PID - 采样 10 秒并生成 SVG:
py-spy record -p <code>PID-o profile.svg --duration 10 - Windows 下必须以管理员权限运行终端,否则读不到进程堆栈
- conda 环境里装的
py-spy,要确保跟目标进程在同一个环境,否则符号解析失败,函数名显示为??? - VSCode 可直接双击打开
profile.svg查看火焰图,但别指望它自动刷新——每次都要重新生成
在 launch.json 里加 --profile 给 pocketpy 用
pocketpy 是个嵌入式 Python 解释器,它的性能分析方式和 CPython 不一样,不能套用 cProfile。
- 启动时加参数:
"args": ["--profile", "your_script.py"],或在代码里调用pkpy.enable_profiler() - 输出是纯文本格式,按行显示耗时占比,例如
98%: for i in range(1000000): - 这个 profiler 是 pocketpy 自研的,只支持行级,不支持函数调用树;也没法导出 .prof 文件供
snakeviz解析 - 如果你误用了标准 Python 的
-m cProfile去跑 pocketpy 脚本,会报错:ModuleNotFoundError: No module named 'cProfile'—— 因为 pocketpy 没实现这个模块
别被“平均耗时”骗了,重点关注 self time 和调用次数
很多工具默认按 total time 排序,容易让你优化错地方。
- 一个
json.loads()调用可能只花 0.5ms,但如果被循环调用 2 万次,self time 就占了整体 10 秒以上 - 在
snakeviz或py-spy top输出里,优先看 “Self Time (ms)” 和 “# Calls” 两列,再判断要不要拆解或缓存 - 异步代码(
await、async for)中,cProfile无法反映事件循环调度开销;这时得靠console.timeLog()打点,或用py-spy观察实际线程状态 - 所有 profiling 结果都不会自动保存,关掉浏览器标签或终端就丢——
snakeviz页面右上角有 “Save” 按钮,py-spy的.svg文件也要手动保留,方便后续对比
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











