如何在 Julia 1.0 中进行记忆化或记忆化

2024-02-21

我一直在尝试用 Julia 来记忆斐波那契函数。这就是我想出来的。

原始未修改的代码(用于控制目的)

function fib(x)
    if x < 3
        return 1
    else
        return fib(x-2) + fib(x-1)
    end
end

这是我的第一次尝试

memory=Dict()

function memfib(x)
    global memory
    if haskey(memory,x)
        return memory[x]
    else
        if x < 3
            return memory[x] = 1
        else
            return memory[x] = memfib(x-2) + memfib(x-1)
        end
    end
end

我的第二次尝试

memory=Dict()

function membetafib(x)
    global memory
    return haskey(memory,x) ? memory[x] : x < 3 ? memory[x]=1 : memory[x] = membetafib(x-2) + membetafib(x-1)
end

我的第三次尝试

memory=Dict()

function memgammafib!(memory,x)
    return haskey(memory,x) ? memory[x] : x < 3 ? memory[x]=1 : memory[x] = memgammafib!(memory,x-2) + memgammafib!(memory,x-1)
end

还有其他我不知道的方法吗?


正如评论中指出的那样,记忆化.jl https://github.com/simonster/Memoize.jl包当然是最简单的选择。这需要您在定义时标记该方法。

然而,迄今为止最有效的方法是使用卡带.jl https://github.com/jrevels/Cassette.jl,它允许您将记忆添加到预先存在的函数中,例如

fib(x) = x < 3 ? 1 : fib(x-2) + fib(x-1)

using Cassette
Cassette.@context MemoizeCtx
function Cassette.overdub(ctx::MemoizeCtx, ::typeof(fib), x)
       get(ctx.metadata, x) do
           result = recurse(ctx, fib, x)
           ctx.metadata[x] = result
           return result
       end
   end

对正在发生的事情进行一些描述:

  • MemoizeCtx是我们定义的盒式磁带“上下文”
  • overdub https://jrevels.github.io/Cassette.jl/latest/api.html#Cassette.overdub is run instead of the original function definition
    • 我们用它来检查 arg 是否存在于元数据字典中。
    • recurse(...)告诉 Cassette 调用该函数,但忽略顶层overload.

现在我们可以通过记忆来运行该函数:

Cassette.overdub(MemoizeCtx(metadata=Dict{Int,Int}()), fib, 80)

现在更酷的是我们可以使用一个现有的函数来调用fib,并记住对的调用fib inside该函数:

function foo()
    println("calling fib")
    @show fib(80)
    println("done.")
end
Cassette.overdub(MemoizeCtx(metadata=Dict{Int,Int}()), foo)

(卡带对编译器来说仍然相当困难,因此第一次运行可能需要一段时间,但之后会很快)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Julia 1.0 中进行记忆化或记忆化 的相关文章

随机推荐

  • Java中的局部变量清空对GC有帮助吗

    我 被迫 添加myLocalVar null 在离开方法之前将语句放入finally子句中 原因是为了帮助GC 有人告诉我下次服务器崩溃时我会在晚上收到短信 所以我最好这样做 我认为这是毫无意义的 因为 myLocalVar 的范围仅限于方
  • 在 SQL 中多次连接同一个表[重复]

    这个问题在这里已经有答案了 我有一个表 每个 tran ref 列有 3 行或更多行 每行都有 amount 以及 tran id 以下是我的输入表 tran ref tran id amount T1 01 9 T1 02 8 T1 03
  • 如何将小数属性格式化为货币?

    我想将小数值格式化为货币值 我怎样才能做到这一点 属性可以返回它们想要的任何内容 但需要返回正确的类型 private decimal amount public string FormattedAmount get return stri
  • 一张图中的多个图

    我有以下代码 我想将相空间图组合成一个图形 我已经对这些函数进行了编码 但我不知道如何让 MATLAB 将它们放入一张图中 正如你所看到的 这是变量r a b and d这会改变 我如何将它们结合起来 我还想使用以下方法绘制这些相空间图的矢
  • C# 中的等效 char*

    我有一个用 C 编写的 dll 我正在 p invoking 来调用这些函数 我有这个 C 声明 int dll registerAccount char username char password 我已经完成了这个 dllimport
  • 在 C# 中处理整数溢出的最佳方法?

    处理整数溢出是一项常见任务 但在 C 中处理它的最佳方法是什么 是否有一些语法糖可以使其比其他语言更简单 或者这真的是最好的方法吗 int x foo int test x common if test common x Console W
  • LARAVEL 获取视图中 withErrors 的结果

    在我使用的控制器中 if validator gt fails return Redirect to admin profile gt withErrors validator gt withInput 如何在视图中获取 withError
  • PHP 5.2.17 的 round() 模式 ROUND_HALF_DOWN

    我需要在 PHP 5 2 17 中模拟 ROUND HALF DOWN 模式 我无法升级服务器的 PHP 版本 有什么想法如何实现这一目标 基本思想是 1 895 变成 1 89 而不是像通常使用 round 那样变成 1 90 编辑 这个
  • ILMerge - 命令退出,代码为 255

    我正在尝试使用 ILMerge 将 DLL 嵌入到单个可执行文件中 我在构建事件 gt 构建后事件命令行中添加了此命令行 C Program Files Microsoft ILMerge ILMerge exe out TargetDir
  • 模型输入必须来自“tf.keras.Input”...,它们不能是先前非输入层的输出

    我正在使用Python 3 7 7 和张量流 2 1 0 我有一个预先训练过的 U Net 网络 我想要得到它的编码器 and 它的解码器 如下图所示 您可以看到卷积编码器 解码器架构 我想要获取编码器部分 即出现在图像左侧的图层 以及解码
  • ASMX Web 服务公开类

    我正在使用简单的 ASMX 服务在 asp net c 中创建基本的 Web 服务 当我创建返回类的方法时 服务的客户端可以发现该类定义 我想知道是否有一种方法可以将类公开给不直接在任何服务方法中使用的服务 我需要我的服务客户端了解特定的类
  • 在javascript刷新中调用php函数

    我在 javascript 中有一个简单的函数 可以在设定的时间后刷新页面 function AutoRefresh t setTimeout location reload true t 现在每次刷新后 我希望它调用 PHP 函数 例如
  • 如何从列表中发出每个项目之间有延迟的项目?

    我想从列表中发出项目 并且在每次发射之间我想要一个延迟 我试过这个 final Subscription subscription Observable from listOfItems delay 2000 TimeUnit MILLIS
  • Eclipse 和 Maven 多模块项目的问题

    我创建了一个 Maven 项目 其结构如下 root project pom xml pom sub projectA jar sub projectB jar 我已完成以下步骤 mvn 原型 创建 DgroupId my group id
  • 如何在sql选择中隐藏不同的列

    我正在 sql 中执行查询以查找具有不同值的行name如下 select distinct name age sex from person 它有效 但我不想在结果集中显示名称列 有没有办法隐藏此栏 EDIT1我说的原因distinct n
  • 有效地将线段排序成循环

    我正在使用一个图书馆 JavaScript Voronoi https github com gorhill Javascript Voronoi 它生成表示闭合多边形的线段数组 这些线段显示无序 无论是线段出现的顺序还是线段每端点的顺序
  • 如何获取动态创建的textview的id?

    我正在尝试为我正在制作的 Android 应用程序动态添加和删除 TextView 但我遇到了设置和获取 TextView id 的困难 我似乎在最后两行代码 et setText 和 ll removeView 中遇到了空指针异常 有人对
  • r 中的翻译(重新编码)错误

    这是一个小例子 X1 lt c AC AC AC CA TA AT CC CC X2 lt c AC AC AC CA AT CA AC TC X3 lt c AC AC AC AC AA AT CC CA mydf1 lt data fr
  • 具有复杂数据输入字段的 ASP.NET MVC UpdateModel

    我如何使用 ASP NET MVC UpdateModel 执行以下操作 我正在尝试将空格分隔的文本框数据 与新的 StackOverflow 问题中的 TAGS 文本框完全相同 例如这个 读入模型中 eg
  • 如何在 Julia 1.0 中进行记忆化或记忆化

    我一直在尝试用 Julia 来记忆斐波那契函数 这就是我想出来的 原始未修改的代码 用于控制目的 function fib x if x lt 3 return 1 else return fib x 2 fib x 1 end end 这