You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化嵌套递归函数 解决Excel转Python时的递归效率问题

Excel表格逻辑转Python递归函数的效率优化方案

问题背景

我正在将复杂的Excel表格逻辑转换为Python代码,以下是该Excel表格的简化示例:

r       a               b          c            d
1       2%             a(r)+1   b(r)*2+a(r)   100
2to100  d(r-1)*.0001   a(r)+1   b(r)*2+a(r)   d(r-1)*c(r)

最初编写的实现代码如下:

def a(r):
  if r==1:
    return 0.02
  else:
    return d(r-1)*0.0001
def b(r):
  return a(r)+1
def c(r):
  return b(r)*2+a(r)
def d(r):
  if r==1:
    return 100
  else:
    return d(r-1)*c(r)

性能问题

当前简化示例理论上可以不用单独定义a、b、c函数,合并为一个递归函数即可,但真实场景下的表格逻辑非常复杂,合并的工作量极高。
分开编写多个递归函数会出现严重的重复调用问题:每一步计算中a函数会被重复调用3次,调用d(100)的操作等价于调用a函数3100≈5.1×1047次,完全无法完成运行,需要在不改动现有分函数结构的前提下,让每一步的a函数仅被调用一次。

优化方案

给递归函数添加lru_cache缓存装饰器即可解决重复计算问题,优化后d(100)的运行时间可缩短到1秒以内,优化后的代码如下:

from functools import lru_cache
@lru_cache(maxsize = 128)
def a(r):
  if r==1:
    return 0.02
  else:
    return d(r-1)*0.0001
def b(r):
  return a(r)+1
def c(r):
  return b(r)*2+a(r)
def d(r):
  if r==1:
    return 100
  else:
    return d(r-1)*c(r)/3

优化原理

lru_cache会自动缓存函数的入参和对应的返回结果,同一个入参第二次调用函数时会直接返回缓存的结果,不会重复执行函数逻辑。本场景下每个r值对应的a(r)只会被计算一次,后续所有调用都直接取缓存结果,从根源上避免了指数级的重复计算。

内容的提问来源于stack exchange,提问作者Walterwang201112

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:18:03