对于功能
function function_maker(N)
if N == 1
x = 1.0
else
x = 1
end
f(y) = x+y
end
我希望它的输出不是类型稳定的,但我希望它生成一个类型稳定的f
,即使用由{的值确定的x
类型{1}}生成依赖于N
的函数。基本上,我希望由此产生的函数具有高性能,但N
本身不需要具有高性能,因为它仅用于全局范围或功能障碍之上。
function_maker
默认情况下不会发生这种情况。我试过了f = function_maker(1)
@code_warntype f(1)
Variables:
#self#::#f#9
y::Int64
Body:
begin
return ((Core.getfield)((Core.getfield)(#self#::#f#9, :x)::ANY, :contents)::ANY + y::Int64)::ANY
end::ANY
,但这也没用。有一种简单的方法可以做到这一点吗?
答案 0 :(得分:2)
有:
julia> function function_maker2(N)
if N == 1
let x = 1.0
return f(y) = x + y
end
else
let x = 1
return f(y) = x + y
end
end
end
function_maker2 (generic function with 1 method)
julia> f2 = function_maker2(1)
(::f) (generic function with 1 method)
julia> @code_warntype f2(1)
Variables:
#self#::#f#5{Float64}
y::Int64
Body:
begin
return (Base.add_float)((Core.getfield)(#self#::#f#5{Float64}, :x)::Float64, (Base.sitofp)(Float64, y::Int64)::Float64)::Float64
end::Float64
此版本分隔x
块内每个分支中的let
。否则编译器似乎感到困惑。