所以我有一个带有函数
f
的模块,我想在调用之前将其包装在一些功能上,比如说我想缓存返回的值,以便对于使用相同参数的后续调用,我们可以直接返回结果。我相信这种技术称为记忆。
抱歉,我无法提供实际的可重现代码,因为它是一个巨大的代码库......
所以代码是这样写的:
# Module.jl
function f(x)
return somecomplexcomputations(x)
end
并进行记忆:
# memorization.jl
function addmemorization(f::Function)::Function
... # Some lines to wrap the function with a wrapper that handles the memorization.
return wrappedfunction
end
所以最后我想覆盖原来的函数
f
:
# after module is being loaded.
Module.f = addmemorization(Module.f)
这绝对是不允许的,它会抛出
invalid redefinition of constant
。
我想将
Module.jl
中的代码远离这些包装,并希望在加载模块后执行此操作,如果原始函数中存在错误,可以更轻松地调试代码f
。
如何正确执行此操作?
为了“缓存返回值,以便后续使用相同参数的调用我们可以直接返回结果”,这确实是 memoizaition 尝试
using Memoize
。
using Memoize
@memoize function f(a, b)
sleep(2)
2a + b
end
现在:
julia> @time f(1,2)
2.012640 seconds (1.53 k allocations: 107.453 KiB, 0.52% compilation time)
4
julia> @time f(1,2)
0.000005 seconds
4