【问题标题】:What are the limitations of memoization?记忆的局限性是什么?
【发布时间】:2014-05-11 16:35:29
【问题描述】:

考虑到程序性能优化的记忆,似乎在某些情况下它可能非常有益,因为它完全消除了重复计算。并且在 Python、Java、C/C++ 等编程语言中有大量现有的语言级支持。其中一个示例是名为 IncPy 的 Python 解释器。它可以自动记忆,程序员不需要额外的工作。

但是,我不认为 memoization 在现实世界的项目中被广泛采用。也没有大公司对此感兴趣。那么,它的主要限制是什么?

欢迎和赞赏任何建议或想法。以下是我理解的一些限制:

  1. 初始执行速度变慢
  2. 空间开销
  3. 程序员的额外负担,因为它可能需要程序员修改代码

(我从这里稍微更新了我的问题。)

感谢您的 cmets。我想在我在这里列出的三个原因中,第三个更重要。这是正确的吗?

如果你认为memoization确实被广泛使用,你能给我一些例子,或者一些关键词吗?

谢谢!

【问题讨论】:

  • 我认为记忆化 被广泛采用,各种类似的缓存技术也是如此。
  • Java、C++ 和当然 C 缺乏语言级别的支持。我认为 Python 也没有,但我可能已经过时了。
  • 你不会在任何地方都使用 memoization - 只有在纯函数上,只有当你希望函数被相同的参数重复调用,并且只有当缓存空间和代码复杂性成本时与运行时节省相比,结果很低 - 但在适当的时候,我们当然会使用它。
  • 特别是对于动态规划算法,memoization 是极其重要的。但大多数时候,它并不适用。
  • 记忆化作为一种​​优化技术很好,并且不受您所说的限制。我用它来加速过去运行在 10 秒内的代码,由于这种技术,现在运行在 0.03 秒内。有限的是接受它、理解它并知道如何应用它的程序员的数量;)。

标签: performance optimization memoization


【解决方案1】:

在一个程序中可以看到一个简单的例子,使用递归获取 febonacci 数列

function memoize(fn)
{
  const cache = {};
  return function(...args)
  {
    if (cache[args])
    {
      return cache[args];
    }

    const result = fn.apply(this, args);
    cache[args] = result;

    return result;
  };
}

function slowfib(n) {
  if(n < 2)
  {
    return n;
  }
  return fib(n-1) + fib(n-2);

}

const fib = memoize(slowfib);

==-=======memoize 的结果============= ✓ 定义 Fib 函数 (3ms) ✓ 计算 1 (1ms) 的正确 fib 值 ✓ 计算 2 的正确 fib 值 ✓ 计算 3 的正确 fib 值 ✓ 计算 4 的正确 fib 值 ✓ 计算 15 的正确 fib 值

测试套件:1 个通过,总共 1 个 测试:6 次通过,共 6 次 快照:共 0 个 时间:1.118s 运行所有匹配 /fib/test.js/i 的测试套件。

=========没有 Memoize 的结果======= 通过 fib/test.js ✓ 定义 Fib 函数 (3ms) ✓ 计算 1 (1ms) 的正确 fib 值 ✓ 计算 2 的正确 fib 值 ✓ 计算 3 的正确 fib 值 ✓ 计算 4 的正确 fib 值 ✓ 计算 15 (747ms) 的正确 fib 值

测试套件:1 个通过,总共 1 个 测试:6 次通过,共 6 次 快照:共 0 个 时间:1.496s

查看最后一次测试所用的时间和总时间

【讨论】:

    【解决方案2】:

    我想其中一个警告(不一定是限制)是当我们试图记忆的函数也可能返回错误时。在这种情况下,必须小心不要记住错误。

    【讨论】:

      猜你喜欢
      • 2012-11-20
      • 2018-05-02
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多