直接回答:定位先行:cProfile 给函数级耗时(累积/自身),py-spy 采样线上进程无侵入出火焰图(生产首选),scalene 区分 CPU/内存/GPU 且按行分析。优化路径按杠杆排序:换算法和数据结构(O(n²) 变 O(n log n) 永远最大头)→ 向量化/用 C 扩展库(NumPy、Polars)→ 减少解释器开销(局部变量缓存、生成器省内存)→ 并行(asyncio 治 I/O、多进程治 CPU)→ 换运行时(PyPy、Cython、Rust 扩展)。

展开解析:高频反模式清单:字符串 += 循环拼接(用 join);list 里 in 判断(换 set);循环里重复属性查找(self.x.y 提到循环外);深拷贝当默认动作(能只读就别 copy);以及隐藏杀手——eq/hash 写慢了拖垮所有 dict 操作。数值计算的金律是把循环推进 C 层:NumPy 向量化通常有 10~100 倍收益,表达式能写成数组运算就别 for。内存与 CPU 常互换:生成器/流式处理降内存但可能重复计算,缓存反之。方法论收束:先建立可复现基准(timeit/pytest-benchmark),每次优化只改一个变量并留测量记录;优化没有测量的部分等于没优化。生产环境别忘了 p99 视角——平均快不等于尾延迟好。

追问方向:py-spy 采样为什么能低开销跑在生产?PyPy 加速的适用与失效场景?Rust 扩展(PyO3)的引入门槛?

(约 460 字)