代码之家  ›  专栏  ›  技术社区  ›  Chen A.

Dict效率随时间测量它返回两个值而不是一个值

  •  2
  • Chen A.  · 技术社区  · 7 年前

    我在测试 defaultdict() dict.setdefault() timeit . 出于某种原因 返回两个值;

    从集合导入defaultdict 从timeit导入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)
    

    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语句一次,并且 然后返回多次执行主语句所需的时间,以秒为单位作为浮点值。 参数是通过循环的次数,默认为100万次。将要使用的主语句、设置语句和计时器函数传递给构造函数。

    • 时间不应该返回一个值吗?我在网上看到的例子也返回了一个值。
    1 回复  |  直到 7 年前
        1
  •  1
  •   Dillon Davis    7 年前

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

    if __name__ == "__main__":
    

    就在您的timeit语句上方,这样也可以解决问题,并且只调用timeit一次(每次)。

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