使闭包类型稳定取决于捕获的变量

时间:2017-11-23 19:47:43

标签: function julia type-stability

对于功能

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 ,但这也没用。有一种简单的方法可以做到这一点吗?

1 个答案:

答案 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。否则编译器似乎感到困惑。