Python pstats 怎样同时限制性能报告的排序和显示条目
如果你已经拿到一份 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 对象的报告展示。
Python tokenize.detect_encoding 怎样识别源文件编码声明
- 上一篇
- Python tokenize.detect_encoding 怎样识别源文件编码声明
- 下一篇
- Python profile 和 cProfile 的计时开销有什么区别
-
- 文章 · python教程 | 50分钟前 |
- Python importlib.metadata.entry_points 怎样按组选择插件入口
- 154浏览 收藏
-
- 文章 · python教程 | 51分钟前 |
- Python pkgutil.get_data 遇到不支持资源读取的加载器会返回什么
- 156浏览 收藏
-
- 文章 · python教程 | 55分钟前 |
- Python aifc 被移除后怎样选择 AIFF 音频处理路径
- 404浏览 收藏
-
- 文章 · python教程 | 58分钟前 |
- Python profile 和 cProfile 的计时开销有什么区别
- 182浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python tokenize.detect_encoding 怎样识别源文件编码声明
- 235浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python mailbox.mbox 修改后为什么还要 flush 和 unlock
- 450浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python tabnanny 怎样检查混合缩进的歧义
- 166浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python mailbox.Maildir 怎样区分新邮件与已读邮件
- 343浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python sched 怎样取消尚未触发的定时事件
- 132浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python sched.scheduler 怎样让 run 不阻塞等待下个事件
- 164浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python cmd.Cmd 的 precmd 和 postcmd 怎样修改命令循环
- 236浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python cmd.Cmd 怎样为交互命令实现参数补全
- 182浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 777次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 773次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 858次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 824次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 652次使用
-
- Python xml.dom.minidom.unlink 怎样释放不再使用的 DOM 树引用
- 2026-10-27 501浏览
-
- Python typing 怎样用 TypeIs 缩小类型
- 2026-10-24 501浏览
-
- Python sqlite3 Connection serialize 怎么导出数据库快照:备份窗口、内存占用与恢复校验
- 2026-08-26 501浏览
-
- Python监控网页状态:requests异常处理实战
- 2026-05-29 501浏览
-
- TensorFlow模型部署为API的TF Serving方法
- 2026-05-26 501浏览

