timeit.timeit()与Timer.autorange()计时结果差异问题求助
问题原因:混淆总时间与单次时间,单位换算错误
你看到的"数量级差异"其实是对输出结果的含义误解导致的,核心问题出在这两点:
timeit.timeit()的返回值是总时间:你设置了
number=100,所以输出的0.0025681090000944096是100次运行的总耗时(秒),单次运行时间应该是0.002568... / 100 = 0.00002568秒,换算成毫秒是0.02568毫秒。autorange的结果是单次时间:你计算的
per_run *1000是单次运行的毫秒数(0.01439毫秒),和上面的单次时间对比,差异仅在2倍以内,属于计时的正常误差,并非数量级差异。
额外影响因素
除了误解结果含义,还有两个细节会导致结果偏差:
- 运行次数的合理性:timeit.timeit用固定100次运行,次数太少会放大计时误差;而autorange会自动选择足够的运行次数(默认让总耗时至少0.2秒),结果更稳定准确。
- 命名空间不一致:你的timeit.timeit通过setup在独立命名空间定义
f,而autorange用globals()调用全局的f。虽然两个f代码一致,但统一命名空间能让对比更严谨,比如修改timeit调用为:t = timeit.timeit("f()", globals=globals(), number=100)
修正后的对比代码
import timeit def f(): x = "-".join(str(n) for n in range(100)) # timeit计算单次时间 total_time = timeit.timeit("f()", globals=globals(), number=1000) per_run_time = total_time / 1000 print(f"timeit单次耗时(秒):{per_run_time:.8f},毫秒:{per_run_time*1000:.6f}") # autorange计算单次时间 run_count, total_timing = timeit.Timer(stmt='f()', globals=globals()).autorange() ar_per_run = total_timing / run_count print(f"autorange单次耗时(秒):{ar_per_run:.8f},毫秒:{ar_per_run*1000:.6f}")
运行后两者的单次耗时会非常接近,误差在合理范围内。
内容的提问来源于stack exchange,提问作者bugmenot123
相关产品推荐
相关产品推荐

