如何将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
。