【问题标题】:Inspecting memoization in Julia在 Julia 中检查记忆
【发布时间】:2020-05-08 17:57:37
【问题描述】:

有一个包Memoize.jl,用它可以在Julia中记忆。它的@memoize 宏创建了一个字典。有没有办法检查这本词典?

举个例子,在我执行之后

@memoize f(n) = n ≤ 1 ? n : f(n-1) + f(n-1)

@show f(10)

我想检查已经生成的f的中间值,所以f(0), f(1), ..., f(10)。

有人写了Memo.jl 作为Memoize.jl 的替代或增强功能,允许自定义和检查。但是,这个包似乎没有维护。

【问题讨论】:

    标签: julia memoization


    【解决方案1】:

    关于 Julia 的好处之一是,像这样的包只是更多的 Julia 代码,而不是用 C 语言做一些无法从主要语言中挖掘出来的东西。 Memoize 的代码非常简单。看看this line

     fcachename = Symbol("##", f, "_memoized_cache")
    

    这告诉你缓存字典的名称,给定f 作为正在记忆的函数的名称。因此,让我们在运行示例代码后尝试使用该名称访问变量:

    julia> var"##f_memoized_cache"
    IdDict{Any,Any} with 10 entries:
      (7,)  => 64
      (6,)  => 32
      (4,)  => 8
      (5,)  => 16
      (9,)  => 256
      (10,) => 512
      (2,)  => 2
      (8,)  => 128
      (1,)  => 1
      (3,)  => 4
    

    瞧!有实际的缓存。它只是一个IdDict,在与方法定义相同的模块中具有一个奇怪的名称。 var"..." 语法是最近添加的自定义字符串文字语法,用于具有“奇怪”名称的标识符——它是 eval(Symbol("##f_memoized_cache")) 的简写。

    当然,由于这不是Memoize API 的官方文档部分,你不能指望它不会改变,但它目前可以工作。我不确定您是否想要更官方的 API,但如果您愿意,您可以打开一个问题,要求将其作为新功能。

    【讨论】:

    • 啊,太棒了,太棒了!顺便说一句,你创造了我最喜欢的语言,非常感谢你!我在 Project Euler 中大量使用它
    猜你喜欢
    • 2016-02-19
    • 2017-07-29
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    相关资源
    最近更新 更多