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 墙钟时间戳,适合记录事件时间;系统时间调整可能让上述差值失真,测耗时仍优先用 perf_counter。
方法三: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()
try:
yield
finally:
print(f"{name} 耗时: {time.perf_counter()-start:.4f}s")
with timer("数据处理"):
sum(range(1000000))
常见问题(FAQ)
Q:perf_counter 和 time() 差多少?
A:日常测量差别不大;但 perf_counter 使用适合短时测量的单调高分辨率时钟;perf_counter_ns 返回纳秒单位整数,不保证纳秒准确度,是官方推荐的计时函数。
Q:测异步代码呢?
A:同样用 perf_counter,在 await 前后取差值即可。
Q:想看每行代码的耗时?
A:逐行用 line_profiler;cProfile 主要统计函数调用及累计/自身时间,不是逐行计时,比手动埋点高效。