有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
Voila!有实际的缓存。它只是一个IdDict
,在与方法定义相同的模块中具有一个奇怪的名称。 var"..."
语法是最近添加的自定义字符串文字语法,用于带有“奇怪”名称的标识符-这是eval(Symbol("##f_memoized_cache"))
的简写。
当然,由于这不是Memoize
API的正式记录部分,因此您不能依靠它的不变而已,但目前可以使用。我不确定您是否要使用更正式的API,但是如果您需要,可以打开一个问题,要求将其作为一项新功能。