关闭垃圾回收对timeit有什么好处?

7 投票
2 回答
1708 浏览
提问于 2025-04-16 08:59

我在阅读timeit模块的代码时,注意到了这一段:

gcold = gc.isenabled()
gc.disable()
timing = self.inner(it, self.timer)
if gcold:
    gc.enable()

这段代码只是保存了垃圾回收的状态(开启或关闭),然后把它关闭。函数inner会执行正在计时的语句。最后,它会把垃圾回收器恢复到之前的状态。

所以我很好奇这样做的意义是什么。如果被测试的代码会使用到垃圾回收,那这不是应该在测试结果中体现出来吗?我是不是漏掉了什么?

2 个回答

7

当然,这段代码应该这样写吧?

gcold = gc.isenabled()
gc.disable()
try:
    timing = self.inner(it, self.timer)
finally:
    if gcold:
        gc.enable()

否则,如果定时的代码出现错误,垃圾回收就会一直处于关闭状态。

我在bugs.python.org上报告了这个问题,并且在Python 2.7.3和3.2.2中已经修复了。

7

垃圾回收的特点是它的发生频率和持续时间有点不可预测。至少从某一段特定代码的表现来看,垃圾回收器的工作就像是在统计中增加了噪音。

从整个程序的角度来看,你说得对,如果你的程序在一个会进行垃圾回收的系统上运行,那么在测量程序性能时确实应该考虑这一点。但通常在评估单个函数时,不会把这个因素考虑进去。

撰写回答