6

我正在阅读 timeit 模块的代码,我注意到了这个部分:

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

这只是存储垃圾收集的状态(打开或关闭)然后将其关闭。该函数inner执行正在计时的语句。然后它将垃圾收集器恢复到其旧状态。

所以我很好奇这是什么意思。如果被测试的代码在垃圾收集器中工作,那么这不应该反映在测试中吗?我错过了什么?

4

2 回答 2

6

垃圾收集的本质是它的频率和持续时间有些不可预测。至少从特定代码块的性能的角度来看,垃圾收集器只是在统计数据中增加了噪音。

从整个程序的角度来看,您是正确的,因为如果您的程序在运行垃圾收集器的系统上运行,那么是的,在测量程序性能时应该考虑到这一点。但它通常不考虑个别功能。

于 2010-12-24T02:19:40.287 回答
6

当然,代码应该这样写吗?

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 中得到了修复。

于 2011-07-07T15:00:24.693 回答