如何替换 Julia 中的函数?

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

所以我有一个带有函数

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

如何正确执行此操作?

julia
1个回答
0
投票

为了“缓存返回值,以便后续使用相同参数的调用我们可以直接返回结果”,这确实是 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
© www.soinside.com 2019 - 2024. All rights reserved.