python 计时装饰器装饰递归函数

查找总结了几种方法:

1、一个引入计次装饰器,

2、一个是嵌套函数

3、多传一个计次参数,本质和入计次装饰器一样

import time

#一个引入计次装饰器,
class Counter(object):
    def __init__(self, fun):
        self._fun = fun
        self.counter = 1

    def __call__(self, *args, **kwargs):
        self.counter += 1
        return self._fun(*args, **kwargs)

def simpletimer(func):
    def wrapper(*arg, **kwargs):
        s = time.time()
        res = func(*arg, **kwargs)
        e = time.time()
        print(e - s)
        return res

    return wrapper

def counttimer(func):
    def wrapper(*args, **kwargs):
        if func.counter == 1:
            s = time.time()
            res = func(*args, **kwargs)
            e = time.time()
            print(e - s)
            return res
        else:
            return func(*args, **kwargs)

    return wrapper

def argtime(func):
    def wrapper(*args,**kwargs):
        if args[1] == 1:
            s = time.time()
            res = func(*args, **kwargs)
            e = time.time()
            print(e - s)
            return res
        else:
            return func(*args, **kwargs)
    return wrapper
@simpletimer
def simple_func(n):
    time.sleep(1)
    if n == 1:
        return 1
    return n + simple_func(n - 1)


@counttimer
@Counter
def count_func(n):
    time.sleep(1)
    if n == 1:
        return 1
    return n + count_func(n - 1)


@simpletimer
#嵌套函数
def nestfunc(n):
    def func(n):
        time.sleep(1)
        if n == 1:
            return 1
        return n + func(n - 1)
    return func(n)
@argtime
#多传一个计次参数count,本质和count计次装饰器一样
def argfunc(n,count):
    time.sleep(1)
    if n==1:
        return 1
    count+=1
    return n+argfunc(n-1,count)

if __name__ == '__main__':
    simple_res = simple_func(5)
    print('-'*10)
    count_res = count_func(5)
    print('-' * 10)
    nest_res = nestfunc(5)
    print('-' * 10)
    arg_res = argfunc(5,1)

输出:

1.0012590885162354
2.0064640045166016
3.006768226623535
4.008423805236816
5.012547016143799
----------
5.009505033493042
----------
5.015216112136841
----------
5.014286756515503

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值