import functools
import time
def function_call_log(func):
# 将name等相应的属性映射过来
@functools.wraps(func)
def clock(*args, **kwargs):
start = time.perf_counter()
result = func(*args)
cost = time.perf_counter() - start
name = func.__name__
# repr : 返回一个对象的 string 格式
arg_lst = []
if args:
arg_lst.append(', '.join(repr(arg) for arg in args))
if kwargs:
pairs = ['%s=%r' % (k, w) for k, w in sorted(kwargs.items())]
arg_lst.append(', '.join(pairs))
arg_str = ', '.join(arg_lst)
print('[%0.8fs] %s(%s) -> %r' % (cost, name, arg_str, result))
return result
return clock
@function_call_log
def foo(n):
if n < 1:
return 1
return n * foo(n-1)
if __name__ == '__main__':
print(foo.__name__)
foo(2, ddda=2, b=4, cc=2)
输出如下:
foo
[0.00000060s] foo(0) -> 1
[0.00002160s] foo(1) -> 1
[0.00003620s] foo(2, b=4, cc=2, ddda=2) -> 2
参考文献:
- 流程的PYTHON
- Python官方文档