我想将 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
这也意味着,在您的 func 中,您可以为 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())