gpt4 book ai didi

python - 函数装饰器

转载 作者:太空狗 更新时间:2023-10-29 22:06:10 25 4
gpt4 key购买 nike

我喜欢能够衡量我编写的 python 函数的性能,所以我经常做类似的事情......

import time

def some_function(arg1, arg2, ..., argN, verbose = True) :
t = time.clock() # works best in Windows
# t = time.time() # apparently works better in Linux

# Function code goes here

t = time.clock() - t
if verbose :
print "some_function executed in",t,"sec."

return return_val

是的,我知道您应该使用 timeit 来衡量性能,但这对我的需求来说效果很好,并且允许我打开和关闭此信息以非常顺利地进行调试。

那段代码当然是在我了解函数装饰器之前写的......我现在对它们了解不多,但我认为我可以使用 **kwds 字典编写一个装饰器来执行以下操作:

some_function(arg1, arg2, ..., argN) # Does not time function
some_function(arg1, arg2, ..., argN, verbose = True) # Times function

尽管如此,我还是想复制我的函数之前的工作方式,这样工作方式更像是:

some_function(arg1, arg2, ..., argN) # Does not time function
some_function(arg1, arg2, ..., argN, False) # Does not time function
some_function(arg1, arg2, ..., argN, True) # Times function

我想这将需要装饰器计算参数的数量,知道原始函数将接受多少参数,去除多余的参数,将正确数量的参数传递给函数...我不确定如何告诉 python 这样做......这可能吗?有没有更好的方法来实现同样的目标?

最佳答案

虽然inspect可能会让你有点不适应,你想要的通常不可能是可能的:

def f(*args):
pass

现在 f 需要多少个参数?由于 *args**kwargs 允许任意数量的参数,因此无法确定函数所需的参数数量。事实上,在某些情况下,函数真正处理的数量与抛给它的数量一样多!


编辑:如果您愿意忍受 verbose 作为特殊关键字参数,您可以这样做:

import time

def timed(f):
def dec(*args, **kwargs):
verbose = kwargs.pop('verbose', False)
t = time.clock()

ret = f(*args, **kwargs)

if verbose:
print("%s executed in %ds" % (f.__name__, time.clock() - t))

return ret

return dec

@timed
def add(a, b):
return a + b

print(add(2, 2, verbose=True))

(感谢 Alex Martelli 提供 kwargs.pop 提示!)

关于python - 函数装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/889088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com