如何使用序列化包序列化Julia函数到文件?



如何将Julia函数对象序列化到磁盘上,以便稍后由不同的进程加载它,而无需共享该函数的实际源文件。序列化似乎对lambdas有效,但对函数似乎失败了。

using StatsBase, Serialization
flam = (x) -> mean(x) + 1
serialize("flam.ser", flam)

现在我打开新的Julia会话,可以反序列化lambda函数:

julia> using StatsBase, Serialization
julia> flam = deserialize("flam.ser")
#1 (generic function with 1 method)
julia> flam(5:7)
7.0

此方法不适用于函数:

julia> f(x) = mean(x) + 1
f (generic function with 1 method)
julia> serialize("f.ser", f)

现在我尝试在一个新的Julia会话:

julia> deserialize("f.ser")
ERROR: UndefVarError: #f not defined

如何序列化Julia函数?

如果出于某种原因想要存储序列化的函数,则需要序列化函数的方法而不是函数本身。按照前面的代码并添加一个没有方法的空函数,您可以发现实际上没有方法被序列化:

julia> function f end
f (generic function with 0 methods)
julia> deserialize("f.ser")
f (generic function with 0 methods)

因此,我们需要序列化函数的方法,而不是函数本身:

julia> f(x) = 2*mean(x)
f (generic function with 1 method)
julia> f(x,y) = 4*mean(x) + y
f (generic function with 2 methods)
julia> serialize("f_first_method.ser", methods(f)[1])
julia> serialize("f_all_methods.ser", methods(f))

现在让我们开始一个新的Julia会话:

julia> function f end
f (generic function with 0 methods)
julia> deserialize("f_first_method.ser")
f(x) in Main at REPL[6]:1
julia> f(6:7)
13.0
julia> deserialize("f_all_methods.ser")
# 2 methods for generic function "f":
[1] f(x) in Main at REPL[6]:1
[2] f(x, y) in Main at REPL[7]:1
julia> methods(f)
# 2 methods for generic function "f":
[1] f(x) in Main at REPL[6]:1
[2] f(x, y) in Main at REPL[7]:1
julia> f(6:7, 0)
26.0

注意,在开始对其方法进行反序列化之前,我们需要创建一个空函数f

最新更新