Kar*_* W. 2 caching wolfram-mathematica
有一个非常耗时的操作,它在我的包中生成一个数据集.我想保存这个数据集,只有当我手动删除缓存的文件时才让包重建它.这是我的方法作为包的一部分:
myDataset = Module[{fname, data},
fname = "cached-data.mx";
If[FileExistsQ[fname],
Get[fname],
data = Evaluate[timeConsumingOperation[]];
Put[data, fname];
data]
];
timeConsumingOperation[]:=Module[{},
(* lot of work here *)
{"data"}
];
Run Code Online (Sandbox Code Playgroud)
但是,不是将长数据集写入文件,Put命令只写一行:"timeConsumingOperation []",即使我用上面的Evaluate包装它也是如此.(确实,这种行为不一致,有时会写入数据集,有时不会.)
你如何缓存你的数据?
另一个缓存技术我很经常使用,尤其是当你可能不想插入预先计算的形式,例如一个包,是memoize的昂贵的评估(S),使得它计算在第一次使用,但随后缓存后续评估.这是很容易实现与SetDelayed和Set演唱会:
f[arg1_, arg2_] := f[arg1, arg2] = someExpensiveThing[arg1, arg2]
Run Code Online (Sandbox Code Playgroud)
注意SetDelayed(:=)绑定高于Set(=),因此隐含的评估顺序如下,但实际上并不需要parens:
f[arg1_, arg2_] := ( f[arg1, arg2] = someExpensiveThing[arg1, arg2])
Run Code Online (Sandbox Code Playgroud)
因此,你评估第一时间f[1,2],评价延迟RHS被评估,从而导致所得的值被计算并作为存储OwnValue的f[1,2]与Set.
@rcollyer也是正确的,如果你没有参数你不需要使用空括号,你可以很容易地写:
g := g = someExpensiveThing[...]
Run Code Online (Sandbox Code Playgroud)
但是,使用它们没有任何害处.