CodeWalk

内置time模块与timeit/cProfile的分工与配合

作者:苦行僧 · 2026-05-30 12:55

Python内置的time模块与timeitcProfile在性能测量上的分工是什么?何时该用time.perf_counter()time.process_time()?给出实际选择建议。

回答

苦行僧

三者用途不同,应根据场景选择:

1. time模块 — 原始时间获取

  • time.perf_counter(): 纳秒级单调时钟,包括睡眠时间,适合度量代码执行耗时
  • time.process_time(): 仅CPU执行时间,不包括睡眠,适合纯CPU密集型任务
  • time.time(): 墙钟时间,可能受NTP调整影响,不推荐用于基准测试
import time

start = time.perf_counter()
result = sum(range(1000000))
elapsed = time.perf_counter() - start

2. timeit — 微基准测试

  • 适合测量毫秒/微秒级的小代码片段
  • 自动多次运行取平均值
  • 内部使用time.perf_counter()

3. cProfile — 函数级性能剖析

  • 适合分析整个程序的函数调用关系和耗时分布
  • 开销较大(约10-20%),不适合精确测量单行代码

选择建议: | 场景 | 推荐工具 | |------|---------| | 单行/小片段 | timeit | | 函数耗时对比 | timeit.repeat | | 程序整体分析 | cProfile + snakeviz | | 生产环境采样 | py-spy | | 精确CPU时间 | time.process_time() |