Python中的局部变量timeit设置



在我读到的所有关于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' ) )

相关内容

  • 没有找到相关文章

最新更新