Union类型作为函数输入参数是不是会导致类型不稳定?

例如Union{Int, Float64}作为函数输入参数会不会引起函数效率低下?

~不会,这是0.7的一大提升:~

额。。。看了一下题目,你问的是说用Union{Int, Float64}作为输入参数会不会导致类型稳定性问题,答案同样是不会。下面说的输入参数的类型是指foo(x::Union{Int, Float64}) = x::Union{Int, Float64}的部分,这部分仅用来作为annotation(用来提前报错,而不是duck typing),即使不写Julia也始终会做 specialize, 所以输入参数的类型不会影响效率。

类型稳定性(type stability)是说函数输出的类型只依赖函数输入的类型,这里的类型是一种参数,这与输入类型具体是什么无关。

但如果不是用在函数上,而是类型里,那么x::Union{Int, Float64}是说x有可能是Int, 还可能是Float64,这会导致x需要等到运行时才被unbox, 从而影响效率,解决方法是用 parametric type, x::T where T<:Union{Int, Float64}
但对于Union{nothing, Float64}这种可以放心使用,编译器会自动优化,具体可以参考上面的issue。

1 个赞