Python最值得关注的装饰器之一!!!

@functools.lru_cache

首先实现一个简单的计时装饰器

def clock(fun):
    @functools.wraps(fun)
    def clocked(*args,**kwargs):
        t0 = time.time()
        result = fun(*args,**kwargs)
        elapsed = time.time()-t0
        name = fun.__name__
        arg_list = []
        if args:
            arg_list.append(','.join(repr(arg) for arg in args))
        if kwargs:
            arg_list.append('%s=%r'%(k,w) for k,w in sorted(kwargs.items()))
        arg_str = ','.join(arg_list)
        print('[%0.8fs] %s(%s)->%r'%(elapsed,name,arg_str,result))
        return result
    return clocked

这个装饰器的功能就是对函数的执行进行计时,和打印函数名和传入的参数。

接下来考虑一个简单的fibonacci函数,如下

@clock
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-2)+fibonacci(n-1)

让我们选取n=25,运行一下,结果如下(截取部分)

[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00099707s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00099707s] fibonacci(4)->3
[0.00099707s] fibonacci(5)->5
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(5)->5
[0.00000000s] fibonacci(6)->8
[0.00099707s] fibonacci(7)->13
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(5)->5
[0.00000000s] fibonacci(6)->8
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(5)->5
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(5)->5
[0.00000000s] fibonacci(6)->8
[0.00000000s] fibonacci(7)->13
[0.00000000s] fibonacci(8)->21
[0.00099707s] fibonacci(9)->34
[0.00099707s] fibonacci(10)->55
[0.00099707s] fibonacci(11)->89
[0.00199437s] fibonacci(12)->144
[0.00398660s] fibonacci(13)->233
[0.01795077s] fibonacci(14)->377
[0.02892256s] fibonacci(15)->610
[0.08277822s] fibonacci(16)->987
[0.11563683s] fibonacci(17)->1597
[0.23634267s] fibonacci(18)->2584
[0.32014227s] fibonacci(19)->4181
[0.61731434s] fibonacci(20)->6765
[1.13275743s] fibonacci(21)->10946
[1.90047622s] fibonacci(22)->17711
[3.04922080s] fibonacci(23)->28657
[4.95341873s] fibonacci(24)->46368
[8.10056996s] fibonacci(25)->75025
cost time is : 8.1005699634552, result is : 75025

可以看到fibonacci(1),fibonacci(2),fibonacci(3)计算了很多次,耗时8秒左右,如果我们能将上述的结果保存下来,下次需要的时候直接拿来用,不是美滋滋?这就是functools.lru_cache这个装饰器的功能了,让我们来演示一下。

@functools.lru_cache()
@clock
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-2)+fibonacci(n-1)


start = time.time()
result = fibonacci(25)
print("cost time is : {}, result is : {}".format(time.time()-start,result))

结果

[0.00000000s] fibonacci(1)->1
[0.00000000s] fibonacci(0)->0
[0.00000000s] fibonacci(2)->1
[0.00000000s] fibonacci(3)->2
[0.00000000s] fibonacci(4)->3
[0.00000000s] fibonacci(5)->5
[0.00000000s] fibonacci(6)->8
[0.00000000s] fibonacci(7)->13
[0.00000000s] fibonacci(8)->21
[0.00000000s] fibonacci(9)->34
[0.00000000s] fibonacci(10)->55
[0.00000000s] fibonacci(11)->89
[0.00000000s] fibonacci(12)->144
[0.00000000s] fibonacci(13)->233
[0.00000000s] fibonacci(14)->377
[0.00000000s] fibonacci(15)->610
[0.00000000s] fibonacci(16)->987
[0.00000000s] fibonacci(17)->1597
[0.00000000s] fibonacci(18)->2584
[0.00000000s] fibonacci(19)->4181
[0.00000000s] fibonacci(20)->6765
[0.00000000s] fibonacci(21)->10946
[0.00000000s] fibonacci(22)->17711
[0.00000000s] fibonacci(23)->28657
[0.00000000s] fibonacci(24)->46368
[0.00000000s] fibonacci(25)->75025
cost time is : 0.0, result is : 75025

看看时间!!!不是说真实运行时间为0,显示精度问题,你
get到了吗?直接起飞,这个装饰器有两个参数,有兴趣的自己去了解吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值