Python性能测试:timeit与default_timer的差异及准确性疑问
问题:timeit()与default_timer的测量结果差异原因及准确性对比
我是Python新手,正在寻找测试代码执行速度并对比不同实现的方法。我发现timeit库很实用,但对timeit()函数与default_timer的输出差异感到困惑。
示例1使用timeit测试maxWealth函数,输出为0.41396119981072843:
from timeit import timeit def maxWealth(accounts): m = 0 for account in accounts: tot = sum(account) if tot > m: m = tot return m list1 = [[1, 2, 3, 5], [1, 2, 45, 6]] print(timeit(lambda: maxWealth(list1)))
示例2使用default_timer测试,输出为6.400048732757568e-06(即0.0000064秒):
from timeit import default_timer as timer def maxWealth(accounts): m = 0 for account in accounts: tot = sum(account) if tot > m: m = tot return m list1 = [[1, 2, 3, 5], [1, 2, 45, 6]] start = timer() result = maxWealth(list1) stop = timer() print(stop-start)
我发现timeit的测量结果更稳定,但二者数值差异极大。根据文档,两者都使用Timer实例,为何会有此差异?哪种方法更准确?
解答
核心差异在于执行次数:
timeit()函数默认会重复执行目标代码100万次(可通过number参数修改),你看到的0.41秒是这100万次执行的总耗时。- 而你的
default_timer代码只执行了1次函数,得到的是单次执行的耗时。
这就是数值差距巨大的原因,并非两者的计时精度有本质区别——timeit底层确实会用到default_timer来计时,但它会自动重复多次执行,再返回总耗时(或平均耗时,取决于是否使用repeat参数)。
关于准确性:
- 对于快速执行的代码(比如你的
maxWealth,单次耗时仅微秒级),单次测量的误差会非常大——操作系统的进程调度、后台任务都会干扰结果,所以timeit的多次重复测量结果更稳定、更可信。 - 若需要单次执行的真实耗时,
default_timer是合适的,但建议多次测量取平均值来减少误差;若要对比不同代码实现的性能,timeit是更省心的选择,它会自动处理重复执行、减少环境干扰,还能避免一些常见计时陷阱(比如函数定义开销、垃圾回收影响)。
总结:
- 测单次执行耗时:用
default_timer,多测几次取平均。 - 对比代码性能/找最优实现:用
timeit,重复执行机制能给出更可靠的对比结果。
内容的提问来源于stack exchange,提问作者Simone Gheller
相关产品推荐
相关产品推荐

