python测试一段代码运行时间的优雅方法
前言:
这个PER的全面整理,简直害死人,怎么这么多事儿?
需要补的知识点太多了啊~
为了要测试PER的时间消耗,都在哪儿,我要记录程序执行的过程中,关键语句的运行时间。
最简陋的方法其实很简单,三句话:
import time
...
st = time.time()
results = function(args)
cost = time.time()-st
但这个代码不适合大面积广泛使用,对于少数几个语句操作还好,凑活着看也行。
因此我刚开始想的是,能不能写个函数:
def cost_time(function, args):
st = time.time()
results = funtcion(args)
cost = time.time()-st
return results, cost
但是这个直接报错好吧,根本不能这么把函数当参数传入。
基于类修饰器的时间计算:
参考代码:
https://github.com/JaloMu/iTimer/blob/master/iTimer.py
import time
from functools import wraps
class Timeit:
def __init__(self, fn = None):
wraps(fn)(self)
def __call__(self, *args, **kwargs):
start = time.time()
ret = self.__wrapped__(*args, **kwargs)
cost = time.time() - start
return ret, cost
if __name__ == "__main__":
@Timeit
def add(x, y):
return x+y
r, cost = add(2, 3)
print("r:", r)
print("cost:", cost)
基于函数修饰器:
参考链接:
如何理解Python装饰器? - NET.Dzreal的回答 - 知乎
import time
# 定义装饰器
def time_calc(func):
def wrapper(*args, **kargs):
start_time = time.time()
f = func(*args,**kargs)
exec_time = time.time() - start_time
print("func.name:{}\texec_time:{}".format(func.__name__, exec_time))
return f
return wrapper
# 使用装饰器
@time_calc
def add(a, b):
return a + b
@time_calc
def sub(a, b):
return a - b
sum = add(1, 3)
part = sub(23, 1)
好处在于只需要在函数定义的时候,加上修饰器语句,调用的语句一点都不用动,麻烦在于,无法全局判断,是否打印这些花里胡哨的东西。
判断是否打印的升级版
import time
# 定义装饰器
def time_calc(print_flag):
def inner_time_calc(func):
def wrapper(*args, **kargs):
start_time = time.time()
f = func(*args,**kargs)
exec_time = time.time() - start_time
if print_flag:
print("func.name:{}\texec_time:{}".format(func.__name__, exec_time))
return f
return wrapper
return inner_time_calc
# 使用装饰器
# print_flag = False
print_flag = True
@time_calc(print_flag=print_flag)
def add(a, b):
return a + b
@time_calc(print_flag=print_flag)
def sub(a, b):
return a - b
sum = add(1, 3)
part = sub(23, 1)
总结:
最后一个效果不错!
nice好吧