假设我有一个函数:
def func(x):
time.sleep(x)
return x
在每个需要的地方都会调用它,例如
func_a in class A
,func_b in class B
...并且所有模块都从一个主函数开始,main()
。
现在我想统计
func
的被叫频率和时间。和profiler
类似,但是我只想得到func
的统计数据;我不关心其他方法。
一个Decorator只能获取一次时间,这对于总时间来说是不够的。另一个问题是
func
覆盖了另一个包中的函数。可能会被包中的函数调用,给每个调用方法都添加一个装饰器并不容易
def time(func):
def wrapper(*args, **kwargs):
import time
st = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"execution time: {end - st}")
return result
return wrapper()
@time
def func(x):
...
有没有什么简单的方法可以用最少的代码获得
func
的总执行量?
如果您只想在当前调用的执行时间旁边打印总执行时间,您可以将总执行时间存储在装饰器中的局部变量中,并将当前调用的执行时间添加到其中:
import time
def timer(func):
def wrapper(*args, **kwargs):
nonlocal total
start = time.time()
result = func(*args, **kwargs)
duration = time.time() - start
total += duration
print(f"Execution time: {duration} Total: {total}")
return result
total = 0
return wrapper
演示:在线试用!
或者,如果您希望能够单独访问总执行时间,您可以将其公开为装饰器函数对象的附加属性:
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
duration = time.time() - start
wrapper.total_time += duration
print(f"Execution time: {duration}")
return result
wrapper.total_time = 0
return wrapper
这样:
@timer
def func(x):
time.sleep(x)
return x
print(func(1))
print(func(2))
print(f'Total: {func.total_time}')
输出:
Execution time: 1.00111985206604
1
Execution time: 2.0005435943603516
2
Total: 3.0016634464263916
演示:在线试用!