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