前言:
前一篇简单探讨了python递归的深度问题,递归深度有了底,你可以大胆使用递归了,然而问题又来了,有朋友说python的递归和蜗牛一样慢,那么有没有优化的余地呢?因为我也是菜鸟,所以简单提供几种优化方案供大家学习交流,主要思路学习于简书我们测试案例有所区别;
具体优化:
优化思路:第一角度优化算法,根据递归的计算过程计算过程中实例化了大量重复的函数计算,第一角度尝试优化计算逻辑,但是这虽然计算过程看起来像一个二叉树,但是怎么优化算法说实话心里没谱;
既然优化算法没法实现,那么我们分析一下耗时的原因,其实在递归过程中自身调用自身不断实例化自身,计算机堆内存溢出导致递归有深度一次,在运算结果时候也是不断去计算每个实例化返回值,是否可以将计算过程中实例化返回值保存在一个缓存中或者一个IO中,计算结果时候每次从缓存护着IO中读取是不是能简化计算量从而提高效率呢?尝试去寻找一下缓存解决方案。最终找到好几种缓存优化方案,下面来共同学习下:
看方案之前我们先测试一下1000次斐波那契数列递归结果耗时,最终对比每一种缓存方案结果来进行比较:
代码实现和结果(本篇就不上图了):
#coding:utf-8
from timeit import Timer
import sys
sys.setrecursionlimit(3000)
#没有使用缓存的斐波那契数列
def fib(n):
if n <= 2:
return 1
else:
return fib(n-1)+fib(n-2)
if __name__ == "__main__":
t1 = Timer("fib(100)","from __main__ import fib")
# 斐波那契数列递归深度100,计算1000次平均时间
print("fib--100", t1.timeit(number=1000), "seconds")
#计算结果我的电脑没计算出来,后边使用深度20做了计算;
方案一:使用计算缓存:
#coding:utf-8
from timeit import Timer
import sys
sys.setrecursionlimit(3000)
#使用计算缓存
def cache_fib(n, _cache={}):
if n in _cache:
return _cache[n]
elif n > 1:
return _cache.setdefault(n, cache_fib(n-1) + cache_fib(n-2))
return n
if __name__ == "__main__