@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到了吗?直接起飞,这个装饰器有两个参数,有兴趣的自己去了解吧。