在我读到的所有关于timeit的地方,我只发现我可以这样使用变量:
s1 = 'abc'
s2 = 'abc'
timeit.timeit('s1==s2', 'from __main__ import s1, s2', number=10**4)
或
s1 = 'abc'
s2 = 'abc'
def func():
timeit.time('s1==s2', 'from __main__ import s1,s2', number=10**4)
意味着你也可以使用timeit。函数中的时间,只要变量在主程序中。我想使用timeit。使用它所在范围内的变量timeit,例如:
def func():
s1 = 'abc'
s2 = 'abc'
timeit.timeit(...)
如你所见,我的问题是:
我如何使用timeit。当它们都不在主程序中时,使用同一作用域中的变量Timeit ?
我想使用timeit。
TLDR:
使用lambda
闭包(这样称呼是因为它关闭了函数中的变量):
def func():
s1 = 'abc'
s2 = 'abc'
return timeit.timeit(lambda: s1 == s2)
我认为这正是你所要求的。
>>> func()
0.12512516975402832
在全局作用域中,你想用全局,而局部作用域中,局部?在全局作用域中,locals()
返回与globals()
相同的值,因此如果您将', '.join(locals())
粘贴到'from __main__ import '
或globals()
的末尾,因为它们在全局作用域中是等效的:
>>> s1 = 'abc'
>>> s2 = 'abc'
>>> timeit.timeit('s1==s2', 'from __main__ import ' + ', '.join(globals()))
0.14271061390928885
你也可以用函数和globals()
来做这件事,但是你不能使用locals():
s1 = 'abc'
s2 = 'abc'
def func():
return timeit.timeit('s1==s2', 'from __main__ import ' + ', '.join(globals()))
和
>>> func()
0.14236921612231157
,但是下面的不起作用,因为您必须从import语句访问隐藏在函数局部作用域中的变量:
def func():
s1 = 'abc'
s2 = 'abc'
return timeit.timeit('s1==s2', 'from __main__ import ' + ', '.join(locals()))
但是因为你可以简单地将函数传递给timeit,你可以做的是:
def func(s1='abc', s2='abc'):
s1 == s2
和
>>> timeit.timeit(func)
0.14399981498718262
这也意味着,在你的函数中,你可以为timeit提供一个lambda闭包:
def func():
s1 = 'abc'
s2 = 'abc'
return timeit.timeit(lambda: s1 == s2)
或完整函数def:
def func():
s1 = 'abc'
s2 = 'abc'
def closure():
return s1 == s2
return timeit.timeit(closure)
我认为这正是你所要求的。
>>> func()
0.12512516975402832
当它们都不在主程序中时
如果你想从__main__
以外的其他模块连接全局变量,使用这个:
'from ' + __name__ + ' import ' + ', '.join(globals())
正如jonrsharpe所解释的那样,对于运行在timeit
作用域上的函数来说,没有(直接的)方法可以访问其作用域之外的非全局的东西。
你应该考虑重写你的函数,把它需要使用的变量作为参数——使用全局变量通常被认为是一种不好的做法,会导致很多问题
为了给timeit.timeit
提供参数,您可以使用部分函数:
from functools import partial
def func(s1,s2):
pass
timeit.timeit( partial( func, s1='bla', s2='bla' ) )