Python——浅谈python递归问题的优化

前言:

       前一篇简单探讨了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__
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值