Python pstats 怎样同时限制性能报告的排序和显示条目
来源:17golang原创
时间:2026-10-29 18:29:07 499浏览 收藏
如果你已经拿到一份 profile 数据,却发现报告太长,通常不需要重新采集。pstats.Stats 把“按什么顺序看”和“显示多少条”拆成了两个动作:先用 sort_stats() 选择排序键,再用 print_stats() 传入数量、比例或函数名限制。两者可以直接链式调用。
官方地址:https://docs.python.org/3/library/pstats.html
最常用的写法是pstats.Stats('profile.prof').sort_stats(SortKey.CUMULATIVE).print_stats(10):按累计耗时排序,再打印前 10 条。若还要按函数名筛选,就继续给print_stats()传限制参数。
排序和显示条目分别由谁控制
sort_stats() 决定报告表格的排序方式,print_stats() 决定这次输出保留哪些条目。不要把 print_stats(10) 理解成“重新计算前十名”;它只是从当前排序结果中限制输出。

例如,想优先查看累计耗时最高的函数,可以这样写:
import pstats
from pstats import SortKey
# 读取已有的性能统计文件。
stats = pstats.Stats("profile.prof")
# 累计耗时决定排序,10 决定本次报告最多显示多少条。
stats.sort_stats(SortKey.CUMULATIVE).print_stats(10)
如果关心函数自身消耗的时间,把排序键换成 SortKey.TIME;如果需要多级排序,可以传入多个键,后面的键用于打破前面排序键相同的情况。
数量、比例和函数名可以怎样限制
print_stats() 的限制参数有三类:整数表示最多保留多少条,0 到 1 之间的浮点数表示保留数据集的一部分,字符串则按函数名做正则匹配。它们都只影响显示,不会改变 profile 文件本身。
from pstats import SortKey
# 先按自身耗时排序,再只显示前 10 条。
stats.sort_stats(SortKey.TIME).print_stats(10)
# 只查看排序结果中的前 10%,适合先观察整体热点。
stats.sort_stats(SortKey.CUMULATIVE).print_stats(0.1)
# 只显示函数名匹配 init 的条目;字符串按正则处理。
stats.sort_stats(SortKey.NAME).print_stats("init")
一个常见误区是把整数当成筛选条件。print_stats(10) 不是“找出所有调用次数等于 10 的函数”,而是把输出条数上限设为 10。
多个限制为什么要特别注意顺序
限制参数会按书写顺序依次应用。print_stats(0.1, "init") 表示先取当前排序结果的前 10%,再从这部分结果里匹配函数名;最后可能少于预期的条目。

from pstats import SortKey
# 先取前 10%,再匹配 init;这是两层限制,不保证得到 10 条。
stats.sort_stats(SortKey.CUMULATIVE).print_stats(0.1, "init")
# 如果目标是“匹配 init 的结果里再取前 10 条”,先写匹配条件。
stats.sort_stats(SortKey.CUMULATIVE).print_stats("init", 10)
这两个写法没有谁绝对正确,区别在于你的问题是“全局热点中的 init”还是“init 函数中的热点”。先确定筛选集合,再决定数量上限,通常更符合后者的阅读预期。
调用者和被调用者报告也能复用限制
确定热点条目后,还可以用 print_callers() 查看谁调用了它,或用 print_callees() 查看它调用了谁。这两个方法接受与 print_stats() 相同的限制参数,因此可以保持同一套排序和筛选思路。
from pstats import SortKey # 只查看累计耗时最高的 5 个函数及其调用来源。 stats.sort_stats(SortKey.CUMULATIVE).print_callers(5) # 对同一批限制后的条目,查看它们继续调用了哪些函数。 stats.sort_stats(SortKey.CUMULATIVE).print_callees(5)
需要记住的是,限制针对的是要展示的函数集合,而不是把原始统计数据永久删除。若要换一个视角,重新调用 sort_stats() 和对应的打印方法即可。
最后记住这三个判断
- 想改变“谁排在前面”,调整
sort_stats()的键。 - 想改变“这次显示多少”,给
print_stats()传整数、比例或函数名匹配。 - 多个限制按从左到右依次收窄,顺序不同,结果集合也可能不同。
相关问题
为什么我传了 10,结果不足 10 条? 如果前面已经有比例或字符串限制,后续的 10 只是在剩余集合中取上限。
应该使用 CUMULATIVE 还是 TIME? 想看调用链整体耗时用 CUMULATIVE,只看函数自身耗时用 TIME,关键是先明确优化目标。
排序会修改 profile 文件吗? 不会。排序和限制只影响当前 Stats 对象的报告展示。
-
154 收藏
-
156 收藏
-
404 收藏
-
182 收藏
-
235 收藏
-
450 收藏
-
166 收藏
-
343 收藏
-
132 收藏
-
164 收藏
-
236 收藏
-
182 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习