内置time模块与timeit/cProfile的分工与配合
Python内置的time模块与timeit、cProfile在性能测量上的分工是什么?何时该用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() |