Python 中如何测量程序(或代码段)的执行时间?
测量 Python 代码执行时间:time.perf_counter() 最适合精确计时,time.time() 简单通用,timeit 模块适合小段代码的基准测试。
精确计时推荐 time.perf_counter()——它是单调高精度时钟,不受系统时间调整影响。简单场景用 time.time() 差值也够;小段代码的严肃基准测试用 timeit 模块。
方法一:time.perf_counter()(推荐)
import time
start = time.perf_counter()
# 要计时的代码
result = sum(range(1000000))
elapsed = time.perf_counter() - start
print(f"耗时: {elapsed:.4f} 秒")
perf_counter 是单调时钟,即使系统时间被 NTP 调整也不会影响计时结果。
方法二:time.time()(简单场景)
import time
start_time = time.time()
# ... 执行代码 ...
print("耗时:", time.time() - start_time)
返回 Unix 时间戳,精度足够大多数日志用途。
方法三:timeit(基准测试)
import timeit
t = timeit.timeit('sum(range(1000))', number=10000)
print(f"平均每次: {t/10000*1000:.4f} 毫秒")
自动多次运行取总耗时,屏蔽偶然波动,适合比较不同实现的性能。
进阶:上下文管理器/装饰器
from contextlib import contextmanager
import time
@contextmanager
def timer(name):
start = time.perf_counter()
yield
print(f"{name} 耗时: {time.perf_counter()-start:.4f}s")
with timer("数据处理"):
sum(range(1000000))
观测云对照
生产环境的性能测量不建议靠手写计时——观测云 APM 通过分布式链路追踪自动记录每个方法的耗时,火焰图直观展示瓶颈,比埋点计时全面得多。
常见问题(FAQ)
Q:perf_counter 和 time() 差多少?
A:日常测量差别不大;但 perf_counter 精度更高(纳秒级)且单调递增,是官方推荐的计时函数。
Q:测异步代码呢?
A:同样用 perf_counter,在 await 前后取差值即可。
Q:想看每行代码的耗时?
A:用 line_profiler 或 cProfile 做性能剖析,比手动埋点高效。