问题标签 [memoization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
4801 浏览

recursion - 如何在 Clojure 中生成记忆递归函数?

我正在尝试编写一个在 Clojure 中返回记忆递归函数的函数,但我无法让递归函数看到它自己的记忆绑定。这是因为没有创建 var 吗?另外,为什么我不能在用 let 创建的本地绑定上使用 memoize?

这个从特定数字开始的稍微不寻常的斐波那契序列生成器是我希望我能做的一个例子:

使用with-local-vars似乎是正确的方法,但它对我也不起作用。我想我不能关闭vars?

我当然可以手动编写一个宏来创建一个封闭的原子并自己管理记忆,但我希望在没有这种黑客的情况下做到这一点。

0 投票
5 回答
5224 浏览

java - Java:自动记忆

我的代码中有一些函数,使用 memoization 很有意义(似乎甚至是强制性的)。

我不想分别为每个功能手动实现。有什么方法(例如在 Python 中)我可以只使用注释或做其他事情,所以我可以在我想要的那些函数上自动获得它?

0 投票
4 回答
11074 浏览

haskell - GHC Haskell 中什么时候自动记忆?

我无法弄清楚为什么 m1 显然被记住了,而 m2 不在以下内容中:

m1 10000000 在第一次调用时大约需要 1.5 秒,而在后续调用中只需要一小部分时间(大概它会缓存列表),而 m2 10000000 总是需要相同的时间(每次调用都重建列表)。知道发生了什么吗?关于 GHC 是否以及何时会记忆功能是否有任何经验法则?谢谢。

0 投票
3 回答
376 浏览

ruby-on-rails - Rails 不能跨浏览器请求缓存预先计算的值?(比如记住n个阶乘结果)

例如,下面的代码:

如果我localhost:3000/foos多次加载,它会显示不同的值,如果是开发模式也不足为奇,因为每次浏览器请求进入时,Rails 都会重新加载控制器(以及模型和视图)。

但是即使在生产模式下,当所有内容都加载并保留在那里时,@foo' 的值不会在浏览器请求中保留?每次在网络浏览器上重新加载页面时,都会显示一个不同的数字。那么 Rails 每次都会清除所有值吗?如果我们不使用 DBMS,有没有办法跨请求缓存或“记忆”结果?


令人惊讶的是,我只是尝试使用类变量,而在开发模式下,它每次都给出不同的数字。在生产模式下,数字在 Firefox 上保持不变,然后 Chrome 也会一直显示该数字,直到服务器重新启动:

为什么类变量可以记忆而实例变量不能?在 Rails 2.x、3.x 和 Ruby 1.8.7 和 1.9.2 中,使用类变量是一种可靠的跨请求“记住事物”的可靠方法吗?

0 投票
10 回答
50913 浏览

python - 在 Python 中缓存类属性

我正在用 python 编写一个类,我有一个需要相对较长时间来计算的属性,所以我只想做一次。此外,类的每个实例都不需要它,所以我不想__init__.

我是 Python 新手,但不是编程新手。我可以很容易地想出一种方法来做到这一点,但我一次又一次地发现,做某事的“Pythonic”方法通常比我使用其他语言的经验想出的方法简单得多。

在 Python 中是否有“正确”的方法来做到这一点?

0 投票
3 回答
5971 浏览

python - python 可重置实例方法记忆装饰器

我正在尝试为将记住结果的类的实例方法构建一个装饰器。(这已经做过一百万次了)但是,我希望能够在任何时候重置记忆缓存的选项(例如,如果实例状态中的某些内容发生了变化,这可能会改变方法的结果没有任何内容与它的参数有关)。因此,我尝试将装饰器构建为类而不是函数,以便我可以作为类成员访问缓存。这使我走上了学习描述符的道路,特别是__get__方法,这是我真正陷入困境的地方。我的代码如下所示:

这清楚和/或可能吗?每次__get__调用时,我都会得到一个全新的记忆类实例,它会丢失包含实际数据的缓存。我一直在努力工作__get__,但没有取得太大进展。

是否有一个完全独立的方法来解决我完全遗漏的这个问题?欢迎和赞赏所有建议/建议。谢谢。

0 投票
4 回答
5127 浏览

python - 我可以记住一个 Python 生成器吗?

我有一个runquery调用数据库的函数,然后一一生成行。我写了一个 memoize 装饰器(或者更准确地说,我只是从这个 stackoverflow 问题中偷了一个)但是在随后的调用中它只会产生一个空序列,大概是因为生成器的值只能产生一次。

如何修改适用于 Python 生成器的记忆装饰器?我意识到我需要在某个时候将它存储在内存中,但我想在装饰器中处理它而不是修改原始函数。

memoization 函数的当前代码是:

0 投票
2 回答
352 浏览

c# - 重构并删除此记忆代码中的重复项

我试图从这段代码中删除一些重复,并让它轻松支持具有更多参数的函数。

您将如何改进此代码并允许更复杂的功能?

另外,我担心我的密钥生成,一些对象不会明显地序列化为字符串,而只是返回它们的类型名,而不是唯一值。建议?

编辑:我使用了 ChaosPandion 的答案,并把它归结为

0 投票
6 回答
15553 浏览

python - Python - 任何人都有一个可以处理不可散列参数的记忆装饰器吗?

我一直在使用以下 memoizing 装饰器(来自伟大的书 Python Algorithms: Mastering Basic Algorithms in the Python Language ... 喜欢它,顺便说一句)。

这个装饰器的问题是基于字典的缓存意味着我所有的参数都必须是可散列的。

有没有人有允许不可散列参数(例如字典)的实现(或对此进行调整)?

我知道缺少哈希值意味着“这是在缓存中吗?”的问题。变得不平凡,但我只是想我会问。

===已编辑以提供上下文===

我正在研究一个函数,它返回一个 Parnas 风格的“使用层次结构”,给定一个模块字典:依赖项。这是设置:

以便:

_level 是我想记住的功能,以使此设置更具可扩展性。在没有记忆的情况下实现,它会多次计算依赖级别(例如,在上面的示例中,我认为“a”计算了 8 次)。

谢谢,

麦克风

0 投票
2 回答
539 浏览

ruby - 我应该如何避免记忆导致 Ruby 中的错误?

对于如何避免由于可变状态而导致错误的记忆有共识吗?

在此示例中,缓存结果的状态发生了变化,因此在第二次调用时给出了错误的结果。

我可以看到避免这种情况的方法是:

  1. greeting可以返回一个dupclone@greeting_cache[formality]
  2. greeting可能freeze的结果@greeting_cache[formality]memoization_mutator这会导致在向其附加字符串时引发异常。
  3. 检查所有使用结果的代码,greeting以确保它没有对字符串进行任何变异。

是否就最佳方法达成共识?做(1)或(2)的唯一缺点是降低性能吗?(我还怀疑如果对象引用了其他对象,冻结对象可能无法完全工作)

旁注:这个问题不会影响 memoization 的主要应用:由于Fixnums 是不可变的,计算斐波那契数列不存在可变状态的问题。:)