在 Julia 中检查记忆

Inspecting memoization in Julia

有一个包 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 的一个好处是,像这样的包只是更多的 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"..." 语法是最近为具有 "strange" 名称的标识符添加的自定义字符串文字语法——它是用于执行 eval(Symbol("##f_memoized_cache")).

的 shorthand

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