题目来源:廖雪峰的官方网站
python初学者,求轻喷
题目:请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
方法一:在函数内部记录始末时间(利用time模块):
def fn()
start_time=time.time()
result=func(*args, **kwargs)
#从start到end指函数运行的主体部分
end_time=time.time()
print('%s executed in %s ms' % (fn.__name__, end_time-start_time))
return result
方法一的好处是容易理解,而且对于只需要记录单个函数执行时间的情况易于实现,但是如果要记录多个函数的执行时间,使用方法一就会让代码过于累赘。因此可以改进为一个decorator。
方法二:定义一个decorator,对需要记录时间的函数进行监控
# -*- coding: utf-8 -*-
import time, functools
def metric(fn):
def measure_time(*args, **kwargs):
start_time=time.time()
result=fn(*args, **kwargs)
end_time=time.time()
print('%s executed in %s ms' % (fn.__name__, end_time-start_time))
return result
return measure_time
# 测试
@metric
def fast(x, y):
time.sleep(0.0012)
return x + y;
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z;
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
#运行结果
fast executed in 0.002067089080810547 ms
slow executed in 0.12447643280029297 ms
注:@metric相当于该函数执行了fn=metric(fn)