🐍Python 工程与虚拟环境
性能分析与 Profiling
面试回答
常见问法
- Python 代码变慢了,你会怎么定位?
cProfile、line_profiler、memory_profiler、py-spy分别用在什么场景?- Python 的性能瓶颈常见有哪些?
- NumPy / pandas 能怎么做性能优化?
回答
待补充:主线是「测量 → 定位 → 优化 → 回归」的四步法,强调不要猜、先测量;CPU 密集、I/O 密集、内存瓶颈分别对应不同工具。
追问
cProfile的tottime和cumtime区别?py-spy为什么不影响线上性能?__slots__真的能提升性能吗?- dict vs defaultdict vs Counter 哪个更快?
原理展开
- 采样 vs 插桩:
cProfile插桩(精确但慢),py-spy采样(低开销可线上) - 工具矩阵:
- 函数级:
cProfile+snakeviz - 行级:
line_profiler(@profile装饰器) - 内存:
memory_profiler、tracemalloc - 线上:
py-spy dump/top/record - 火焰图:
py-spy record -o flame.svg
- 函数级:
- 优化思路:
- 算法复杂度(最大收益)
- 批处理 / 向量化(NumPy / pandas)
- 减少内存分配(
__slots__、array、bytearray) - C 扩展 / Cython / Numba
- 异步 / 并行(GIL 限制下选多进程或 native 扩展)
易错点
- 先优化后测量,优化了非瓶颈
- 用
time.time()粗测,忽略 warm-up 和 GC 影响(应该用timeit) - 用 list 推导做本该向量化的事
- 误以为多线程能加速 CPU 密集型(被 GIL 卡死)
记忆技巧
- 四步法:测量 → 定位 → 优化 → 回归
- 工具选型:粗看 cProfile,精看 line_profiler,线上看 py-spy
- 优化顺序:算法 > 数据结构 > 向量化 > C 扩展 > 并行