问题标签 [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.
c# - 线程安全的记忆
让我们以Wes Dyer 的函数记忆方法为起点:
问题是,当从多个线程中使用它时,我们可能会遇到麻烦:
让我们尽量避免这种情况。锁定map
:
显然是一个可怕的想法,因为它阻止我们同时计算f1
许多不同的论点。如果具有值类型,则锁定a
将不起作用a
(无论如何都是一个坏主意,因为我们无法控制a
并且外部代码也可能锁定它)。
以下是我能想到的两个选择:
假设一个Lazy<T>
懒惰评估类(见这里):
或者保留一个额外的对象字典以进行同步:
有更好的选择吗?
c# - 如何从 C# 中的“纯函数”获得优化?
如果我有以下函数,它被认为是纯粹的,因为它没有副作用,并且在给定相同输入x的情况下总是会产生相同的结果。
据我了解,如果运行时了解功能纯度,它可以优化执行,从而不必重新计算返回值。
有没有办法在 C# 中实现这种运行时优化?而且我认为这种优化有一个名称。它叫什么?
编辑:显然,我的示例函数不会从这种优化中获得很多好处。给出这个例子是为了表达我心中的纯洁类型,而不是现实世界的例子。
python - 如何记忆 Django 模型对象的昂贵计算?
我的 UserProfile 对象上有几个 TextField 列,其中包含 JSON 对象。我还为每一列定义了一个 setter/getter 属性,它封装了将 JSON 序列化和反序列化为 python 数据结构的逻辑。
此数据的性质确保将在单个请求中通过视图和模板逻辑多次访问它。为了节省反序列化成本,我想在读取时记住 python 数据结构,在直接写入属性或保存模型对象的信号时失效。
我在哪里/如何存储备忘录?我对使用实例变量感到紧张,因为我不了解查询实例化任何特定 UserProfile 背后的魔力。使用安全,还是我__init__
需要hasattr()
在每次读取时检查 memo 属性的存在?
这是我当前实现的一个示例:
ruby - Ruby 数学函数记忆
我写了一些看起来像这样的代码:
@cachedResults 包含我写的一个二维数组类(在几分钟内),这个函数的目的是确保我永远不必为任何给定的 (x,y) 调用 Math.hypot 两次。[这可以使用对称性和其他东西进一步优化,但无论如何]
所以我调用了这个函数,让它运行了 160000 次;它只用了 15 秒多一点。然后,为了查看它比非 Memoized 版本快多少,我将代码更改为:
而且,令我惊讶的是,再次运行只用了 15 秒多一点。完全相同的时间。所以我的问题是,ruby 中的数学函数是自然记忆的吗?如果是这样,ruby Memoized 的程度如何?
(如果不是,那你为什么认为我一直得到这个结果?)
python - Python func_dict 用于记忆;其他有用的技巧?
Python 函数对象有一个名为的属性字典,该字典func_dict
从函数外部可见并且是可变的,但在调用函数时不会修改。(我从昨天提出的问题的答案中了解到这一点(#1753232):谢谢!)我正在阅读代码(在http://pythonprogramming.jottit.com/functional_programming),它记住了斐波那契数的计算并想,“为什么不使用该func_dict
属性进行记忆?” 它起作用了(见下文;输出在代码的末尾。)。这有点像有一个可用的类属性,但在对象之外有初始化代码(在这种情况下,不是一个类,而是一个函数)。
我想知道使用此属性可以完成哪些类似(或不同)的技巧?
perl - 当提供相同的必需属性时,是否可以检索现有的驼鹿对象,而不是创建一个新对象?
假设我有以下 Moose 包:
然后我创建两个对象并将一个添加为另一个的“NEIGHBOUR”属性:
在其他地方,例如在另一个过程中,$b 的 BCCH 属性可以更新为另一个值:
现在,如果我指
那么我仍然会取回 BCCH 属性的初始值,而不是更新后的值。
我想明智的做法是添加对 $b 而不是 $b 本身的引用,这将解决问题:
但是,我在 Web 应用程序中有这样的场景,其中一个等效于 $b(相同 ID)的对象在多种方法中被实例化,并且可以在任何一种方法中进行更改,这使得传递所有创建对象的引用变得困难。
理想情况下,当调用
制作完成后,只有在不存在具有相同 ID 的对象时才应创建对象。
是一本字典要走的路,像这样:
还是有更整洁的解决方案?
language-agnostic - 为什么记忆化不是语言功能?
我想知道......为什么我所知道的任何语言都没有原生地提供记忆作为语言功能?
编辑:澄清一下,我的意思是语言提供了一个关键字来将给定的函数指定为可记忆的,而不是每个函数都“默认”自动记忆,除非另有说明。例如,fortran 提供关键字 PURE 来指定特定的函数。我猜编译器可以利用这些信息来记忆调用,但我忽略了如果你声明 PURE 一个具有副作用的函数会发生什么。
python - 什么是 memoization 以及如何在 Python 中使用它?
我刚开始使用 Python,我不知道什么是记忆以及如何使用它。另外,我可以有一个简化的例子吗?
c++ - 静态 Objective-C 类中的记忆
说我有一个类方法
谢谢!!
caching - Haskell 缓存函数的结果
我有一个接受参数并产生结果的函数。不幸的是,该函数需要很长时间才能产生结果。该函数经常使用相同的输入调用,这就是为什么如果我可以缓存结果会很方便。就像是
我正在研究 Data.Array,虽然该数组是惰性的,但我需要使用对列表(使用 listArray)对其进行初始化 - 这是不切实际的。如果'key'是'Double'类型,我根本无法初始化它,即使理论上我可以为每个可能的输入分配一个整数,我有数万个可能的输入,我实际上只使用了少数。我需要使用函数而不是列表来初始化数组(或者,最好是哈希表,因为只会使用少数结果)。
更新:我正在阅读 memoization 文章,据我了解,MemoTrie 可以按照我想要的方式工作。也许。有人可以尝试生成“cachedFunction”吗?最好是一个需要 2 个 Double 参数的慢速函数?或者,或者,这需要一个 Int 参数在一个 ~ [0..1 亿] 的域中不会吃掉所有的内存?