Python 使用timeit为不同的测试语句精确运行一次安装程序代码

Python 使用timeit为不同的测试语句精确运行一次安装程序代码,python,profiling,timeit,Python,Profiling,Timeit,使用timeit,我有一个setup代码块,它设置了一个填充虚拟数据的数据结构,我有两个语句(比如,test1和test2),它们以不同的方式从这个数据结构中检索数据 当我这样做的时候 t = timeit.Timer(test1, setup) print t.timeit(3000) t = timeit.Timer(test2, setup) print t.timeit(3000) 我注意到安装程序运行了两次,每次测试一次。是否可以使两个测试共享相同的设置,即只运行一次setup代码块

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

当我这样做的时候

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

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

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

"from setup import name_1, name_2, name_3"
setup
参数设置为
timeit.timeit()
。(请注意,在这种情况下,通配符导入无法正常工作。)

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

"from __main__ import name_1, name_2, name_3"

实现这一点的最简单方法是将设置代码放入模块
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
调用都有自己新的干净的名称空间。@SvenMarnach,谢谢你的建议,但这与我的示例中的方法有什么不同?@TimPietzcker:当然是干净的名称空间,但它仍然与调用代码共享解释器(因此
sys.modules
),所以模块仍然只能导入一次。@skyork:区别在于模块只导入一次,所以安装模块中的代码只执行一次。