1、定义装饰器实现计算函数运行时间
# 自定义装饰器 def compute_time(func): def compute(*args, **kwargs): st = time.time() result = func(*args, **kwargs) et = time.time() print('消费时间 %.6f s' % (et - st)) return result return compute # 使用 @compute_time def work(work_iter=100000): for i in range(work_iter): pass work()
自定义装饰器跟定义函数很相似,思路其实就是去模拟使用装饰器的函数,输入参数一致,期间执行其他操作;装饰器输入为函数,输出返回一个新的函数,即返回一个输入一致的新函数。
在这里在conputer_time装饰器函数里定义一个函数compute用来模仿work函数,但注意在这里输入和输出都应该保持一致,因为我只是计算他的运行时间而不想改变其结果,所以直接调用func获取结果并原封不动的返回。
使用*args, **kwargs来获取输入的所有参数,然后原封不动传给func。
2、自定义上下文管理实现计算运行时间;可以使用类或者函数的方式来定义。
class Timer: def __init__(self): pass # 上文 def __enter__(self): self.st = time.time() return "我是谁" # 下文 def __exit__(self, exc_type, exc_val, exc_tb): self.et = time.time() self.execution_time = self.et - self.st print("共花费时间: %.6f"%(self.execution_time))
使用类的方式来定义上下文管理需要实现_enter__与__exit__两个方法,即分别对应上文与下文,对应刚初始化with语句时与执行with语句后,其中上文可以使用return返回可执行对象,对应with open('file_path') as f:中的f;在执行完with子句后执行下文程序;
import time with Timer() as t: print(t) time.sleep(2)
输出:
也可以使用函数的方式来定义上下文管理。
from contextlib import contextmanager @contextmanager def compute_time(x): # 在进入上下文之前执行的代码 st = time.time() # 在进入上下文时可能会发生异常的代码 yield "我是谁" print(x) et = time.time() print("共花费时间: %.6f"%(et - st))
其中yield以上程序对应上文程序,yield返回可执行对象(也可以直接yield 返回None对象),yield之后对应下文程序。