使用timeit测量的字典效率返回两个值而不是一个

时间:2017-09-22 08:20:49

标签: python-2.7 performance dictionary timeit

我使用defaultdict()测试dict.setdefault() vs timeit效率。出于某种原因,执行timeit会返回两个值;

来自集合的

导入defaultdict 来自timeit import timeit

dd = defaultdict(list)
ds = {}

def dset():
    for i in xrange(100):
        ds.setdefault(i, []).append(i)

def defdict():
    for y in xrange(100):
        dd[y].append(y)

然后我打印两个函数的执行时间,我得到了4个值;

print timeit('dset()', setup='from def_dict import dset')
print timeit('defdict()', setup='from def_dict import defdict')

22.3247003333
23.1741990197
11.7763511529
12.6160995785

Timeit.timeit docs says

  

主要陈述的时间编号执行。这将执行一次setup语句,然后返回执行主语句多次所需的时间,以秒为单位测量为浮点数。参数是循环次数,默认值到一百万。要使用的主语句,setup语句和timer函数将传递给构造函数。

我在Python 2.7上。

  • 时间不应该返回一个值吗?我在网上看到的例子也返回了一个值。
  • 那么第二个值是什么?

1 个答案:

答案 0 :(得分:1)

当timeit导入setup参数中指示的脚本时,它实际上会导致它再次被调用。当我在python-3中使用你的代码时,它也给了我两个值,但是当它将timeit语句放在另一个脚本中时,它会按原样输出一个值。此外,如果您添加以下行:

if __name__ == "__main__":

就在你的timeit陈述之上,这也将解决问题,并且只会调用一次(每次)。

至于为什么两个值不同,我不得不猜测第二个是原始调用,并且因此在第二个返回并打印后打印,这意味着它具有a)​​输出到的额外延迟打印缓冲区b)从另一个调用返回的时间。