【问题标题】:Avoid variable recomputation?避免变量重新计算?
【发布时间】:2016-02-10 00:34:33
【问题描述】:

我有这样的行代码 -

while someMethod(n) < length and List[someMethod(n)] == 0:
    # do something
    n += 1

其中someMethod(arg) 对数字n 进行了一些计算。这段代码的问题是我要执行两次相同的计算,这是我需要避免的。

一种选择是这样做 -

x = someMethod(n)
while x < length and List[x] == 0:
    # do something
    x = someMethod(n + 1)

我将someMethod(n) 的值存储在变量x 中,然后再使用它。然而,这种方法的问题是代码在一个被多次调用的递归方法中。因此,会创建大量变量 x 的多余实例,这会减慢代码速度。

这是代码的片段 -

def recursion(x, n, i):
    while someMethod(n) < length and List[someMethod(n)] == 0:
        # do something
        n += 1
    # some condition
    recursion(x - 1, n, someList(i + 1))

而且这个递归方法在整个代码中被调用了很多次,而且递归的深度很深。 有没有其他方法可以解决这样的问题?

如果可能,请尽量独立于语言。

【问题讨论】:

  • 堆栈上的 int 不会减慢任何速度,在 Java 中,不在 C 中,在 C++ 中,在 FORTRAN 中,不在 Pascal 中,在 ALGOL 60 中,不在...
  • 如果没有 完整的 示例,很难理解这一点……尤其是声称“正在创建变量x 的过多实例,这会减慢代码速度”真的需要更多的理由......
  • 好的。我将编辑问题。
  • 我已经编辑了这个问题。仍然很难证明我的代码是正确的,因为它非常复杂。希望新的编辑有所帮助。
  • 如果你想要一个独立于语言的答案,你为什么用 python 标记它? (如果其他人添加了该标签,也许您应该回滚该编辑)。

标签: python optimization dynamic-programming memoization


【解决方案1】:

你可以使用带有装饰器技术的记忆:

def memoize(f):
    memo = dict()
    def wrapper(x):
        if x not in memo:
            memo[x] = f(x)
        return memo[x]
    return wrapper

@memoize
def someMethod(x):
    return <your computations with x>

【讨论】:

  • OP 说“请与语言无关”
  • 首先,感谢您的回答。像这样的记忆对我来说并不是很有用,因为代码被调用了很多次,记忆本身会减慢代码的速度。
  • @ZagorulkinDmitry OP 在这方面的要求不适合 SO - 那么他应该向程序员或 cs 询问 - SO 是关于具体的编程问题
【解决方案2】:

正如我正确理解你的代码,你正在寻找某种记忆。

https://en.wikipedia.org/wiki/Memoization

这意味着在每次递归调用时,您必须尽可能多地保存过去的计算,以便在当前计算中使用它。

【讨论】:

  • 感谢您的回答。我尝试使用记忆,但没有运气。代码被调用了很多次,以至于记忆本身会减慢代码的速度。
  • @ArulxZ 我没有在你的代码中看到任何形式的记忆
  • 我的意思是我试过了,但后来我删除了它,因为它不是真的有用。 someMethod(n)someMethod(m) 的结果几乎不一样。
  • @ArulxZ memoization 并不是将糟糕的递归算法神奇地转换为良好的递归算法的灵丹妙药。它可以导致显着的改进——但也可能由于开销而导致降级。如果它对您没有帮助,那么它对您也没有帮助,尽管在这种情况下,您询问它似乎很奇怪。如果您有一个输入的子案例,它会有所帮助,也许您可​​以创建一个记忆辅助函数来处理子案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多