检查Julia中的记忆

问题描述 投票:3回答:1

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个回答
2
投票

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,但是如果您需要,可以打开一个问题,要求将其作为一项新功能。

© www.soinside.com 2019 - 2024. All rights reserved.