🐍Python 工程与虚拟环境

性能分析与 Profiling

面试回答

常见问法

  • Python 代码变慢了,你会怎么定位?
  • cProfileline_profilermemory_profilerpy-spy 分别用在什么场景?
  • Python 的性能瓶颈常见有哪些?
  • NumPy / pandas 能怎么做性能优化?

回答

待补充:主线是「测量 → 定位 → 优化 → 回归」的四步法,强调不要猜、先测量;CPU 密集、I/O 密集、内存瓶颈分别对应不同工具。

追问

  • cProfiletottimecumtime 区别?
  • py-spy 为什么不影响线上性能?
  • __slots__ 真的能提升性能吗?
  • dict vs defaultdict vs Counter 哪个更快?

原理展开

  • 采样 vs 插桩:cProfile 插桩(精确但慢),py-spy 采样(低开销可线上)
  • 工具矩阵:
    • 函数级:cProfile + snakeviz
    • 行级:line_profiler(@profile 装饰器)
    • 内存:memory_profilertracemalloc
    • 线上: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 扩展 > 并行