Python 性能方法论
先测量再优化:复杂度、IO、数据结构,再用画像工具定位热点,最后考虑原生扩展。
#type / concept
#status / growing
#tech / dev
#resource / python
#tech / lang / python
[!info] 关联笔记
Python 性能方法论
这个概念为什么出现
“Python 慢”常是未测的借口。真实瓶颈可能是 N+1 查询、错误结构或网络。方法论保证优化花在刀刃上。
[!abstract] 一句话理解 定义指标 → 复现 → 画像/测量 → 改算法或 IO → 回归验证;不凭感觉微优化。
最小可观察示例
场景:对比两种聚合实现的耗时
# perf_count_methods.py
# 业务意图:比较计数循环与 Counter。
# 教学点:用 time.perf_counter 做粗测;正式用 profiler。
from collections import Counter
from time import perf_counter
def count_loop(xs: list[str]) -> dict[str, int]:
d: dict[str, int] = {}
for x in xs:
d[x] = d.get(x, 0) + 1
return d
def main() -> None:
xs = ["a", "b", "a", "c"] * 50000
t0 = perf_counter(); count_loop(xs); t1 = perf_counter()
t2 = perf_counter(); Counter(xs); t3 = perf_counter()
print("loop≈", round(t1 - t0, 4), "counter≈", round(t3 - t2, 4))
if __name__ == "__main__":
main()
建议运行:
python perf_count_methods.py
期望输出:两段耗时数字(机器相关)。
结合场景再看三个关注点
- 粗测有噪声,多次取稳态。
- 正确性先于速度。
- 热点再用
cProfile/py-spy。
核心概念与准确模型
- 复杂度与数据结构
- IO/数据库/序列化
- 解释器开销 vs 原生库
- 并发是否对症
边界情况与反直觉行为
- 微基准误导(缓存、CPU 频率)
- 优化破坏可读性 无测试兜底
- 过早并行 更慢
常见误区
[!warning] 常见误区:先重写 Rust 再说 错误理解:语言是第一瓶颈。
正确模型:先算法与 IO;真热点再下沉。
工程实践
- 预算延迟/吞吐
- 画像进 CI 可选
- 保留可读基线
本节总结
性能是工程过程,不是口号。测量驱动变更。
自测题
- 优化三步?
- 为何单次计时不够?
参考答案
- 测量定位、修改、验证回归。
- 噪声大,需重复与统计直觉。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| cProfile | 文档 | 画像 |
| time.perf_counter | 文档 | 计时 |