python测试一段代码运行时间的优雅方法

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好吧

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hehedadaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值