[英]How to use any function by a decorator regardless of its arguments in Python
我正在寻找一个函数,它将返回执行任何其他函数所需的时间(也许它可以用一个库来完成,但原则上我希望在本地实现它)。 我希望以本机方式实现它),先验它似乎很容易,它可以使用装饰器或通过参数接收函数的经典函数来完成:
def get_function_time(function):
start_time = time.time()
function()
return time.time() - start_time
当然,这只适用于没有参数的函数,在这种情况下,我们可以告诉它为函数传递参数:
def get_function_time(function, parameter):
start_time = time.time()
function(parameter)
return time.time() - start_time
在这里,当调用参数多于或少于一个的函数时,我们会遇到同样的问题。 然后我的疑问就来了,有没有一种方法可以使用装饰器或没有装饰器,根据元素的数量我在函数中发送相同数量的参数。
对于我需要做的一些测试,我实现了这个糟糕的解决方案,考虑到我没有超过 5 个参数的函数。 超过 5 个 argmuentos 的功能为我服务。
def get_function_time(function, parameters: list):
start = time.time()
parameters_num = len(parameters)
if len(parameters) > 6: raise ValueError("Max 5 arguments")
if parameters_num == 0:
function()
elif parameters_num == 1:
function(parameters[0])
elif parameters_num == 2:
function(parameters[0], parameters[1])
elif parameters_num == 3:
function(parameters[0], parameters[1], parameters[2])
elif parameters_num == 4:
function(parameters[0], parameters[1], parameters[2], parameters[3])
elif parameters_num == 5:
function(parameters[0], parameters[1], parameters[2], parameters[3], parameters[4])
return time.time() - start
但是我留下了一个问题,即如何以动态的方式来测量任何函数,不管它的参数是什么(当然,只要它们很好地传递了它们的参数)。
抱歉,如果写问题的方式不是最好的,我在这里没有太多经验。
如果我猜对了,您需要的是*args
和**kwargs
,这意味着按顺序的参数和按关键字的参数。
例如
def get_function_time(function, *args, **kwargs):
start = time.time()
function(*args, **kwargs)
return time.time() - start
那么你可以像这样使用它
get_function_time(function, 'abc', 'def', keyword1='ghi', keyword2='jkl')
这相当于调用function
function('abc', 'def', keyword1='ghi', keyword2='jkl')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.