Python性能测试需明确目标、选对工具、控制干扰、正确解读:用timeit测小段代码,pytest-benchmark做函数对比,cProfile定位热点,memory_profiler查内存,并隔离环境、禁用GC、多次运行取中位数。

Python 性能测试不是简单跑个 time.time() 或看一眼脚本运行几秒,关键在于可复现、有对比、控变量、懂瓶颈。盲目测,结果没意义;测错地方,优化全白费。
明确目标:测什么?为什么测?
性能测试前先问自己三个问题:
- 是想比两个算法谁更快?——需要基准对比(如
timeit或pytest-benchmark) - 是上线前压测接口吞吐量?——需要真实负载模拟(如
locust或apache bench) - 是发现某函数卡顿,想定位热点?——需要代码级剖析(如
cProfile+snakeviz)
目标不清,工具选错,数据就不可信。
用对工具:别让测量本身拖慢你
不同场景对应不同工具,混用会引入干扰:
立即学习“Python免费学习笔记(深入)”;
- 单行/小段代码快慢:用
timeit(自动多次执行、禁用 GC、排除启动开销)python -m timeit -s "import math" "math.sqrt(12345)" - 函数或方法性能对比:用
pytest-benchmark,生成统计摘要(mean、stddev、outliers),支持参数化对比 - 整段逻辑耗时分布:用
cProfile,输出调用次数和累计时间python -m cProfile -s cumulative my_script.py - 内存增长问题:搭配
memory_profiler查看逐行内存占用
控制干扰:让结果真正反映代码本身
Python 运行受太多外部因素影响,必须隔离:
- 关闭无关进程,避免 CPU / 内存抢占
- 同一台机器、同一 Python 版本、同一依赖版本下测试(虚拟环境 +
pip freeze > requirements.txt) - 大对象提前创建,避免把初始化时间算进被测逻辑(例如:先生成好大数据列表,再测处理函数)
- 禁用垃圾回收(
gc.disable())防止 GC 在测试中随机打断,测完再恢复 - 重复运行多次取中位数或去掉极值,不只看单次最快/最慢
解读结果:数字背后要有人话结论
拿到数据只是开始,重点是读出“为什么”:
-
cProfile中关注tottime(函数自身耗时,不含子调用)而非cumtime,找真正的“热点” - 如果某个内置函数(如
json.loads)占时高,别急着重写——先确认是不是数据量真大,或能否用orjson替代 - 对比 A/B 版本时,看相对变化率(如 “快了 37%”)比绝对毫秒值更有意义
- 性能提升不到 10%,但代码更清晰、更易维护?通常值得保留——过早优化是万恶之源
不复杂但容易忽略。测得准,才敢动;看得懂,才有效。











