【问题标题】:Dict efficiency measured with timeit returns two values instead of one用 timeit 测量的字典效率返回两个值而不是一个
【发布时间】:2017-09-22 08:20:49
【问题描述】:

我正在使用timeit 测试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)

然后我打印两个函数的执行时间,我得到了 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 语句,然后返回执行 main 语句所需的时间,以浮点数为单位,以秒为单位。 参数是循环的次数,默认到一百万。将要使用的主语句、设置语句和定时器函数传递给构造函数。

我使用的是 Python 2.7。

  • timeit 不应该返回一个值吗?我在网上看到的例子也返回一个值。
  • 那么第二个值是多少?

【问题讨论】:

    标签: python-2.7 performance dictionary timeit


    【解决方案1】:

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

    if __name__ == "__main__":
    

    就在您的 timeit 语句之上,那么这也将解决问题,并且只会调用 timeit 一次(每个)。

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

    【讨论】:

    • 似乎timeit 导入了整个模块,即使我指定了特定的功能。事实上,当我声明__name__ == __main__ 时,它按预期工作。我确实对其进行了进一步调查,并更新了您的答案以完成它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多