使用 timeit 为不同的测试语句只运行一次设置代码

Posted

技术标签:

【中文标题】使用 timeit 为不同的测试语句只运行一次设置代码【英文标题】:Run setup code exactly once for different test statements using timeit 【发布时间】:2012-07-25 16:24:11 【问题描述】:

使用timeit,我有一个setup 代码块,它设置了一个填充了虚拟数据的数据结构,我有两个语句(例如,test1test2)从这个数据结构中检索数据以不同的方式。

当我这样做时

t = timeit.Timer(test1, setup)
print t.timeit(3000)
t = timeit.Timer(test2, setup)
print t.timeit(3000)

我注意到设置运行了两次,每次测试一次。是否可以让两个测试共享相同的设置,即只运行一次setup 代码块并使用为两个测试创建的完全相同的数据结构?

【问题讨论】:

【参考方案1】:

实现这一点最简单的方法是将设置代码放入模块setup.py,然后使用

"from setup import name_1, name_2, name_3"

作为setup 参数到timeit.timeit()。 (请注意,在这种情况下通配符导入将无法正常工作。)

如果不想使用单独的模块,请将代码放在主模块中并使用

"from __main__ import name_1, name_2, name_3"

【讨论】:

这不是也运行setup 两次吗?我认为每个timeit 调用都有自己的新的干净的命名空间。 @SvenMarnach,感谢您的建议,但这与我示例中的方法有何不同? @TimPietzcker:当然是一个干净的命名空间,但它仍然与调用代码共享解释器(因此sys.modules),所以模块仍然只被导入一次。 @skyork:区别在于模块只导入一次,所以setup模块中的代码只执行一次。

以上是关于使用 timeit 为不同的测试语句只运行一次设置代码的主要内容,如果未能解决你的问题,请参考以下文章

python timeit模块

#python自动化测试#代码执行时间测量模块timeit

避免在 timeit.repeat() 基准测试中进行昂贵的设置

2 timeit模块,python中数据结构

数据结构性能分析(代码运行效率)

python之timeit模块