例如Union{Int, Float64}作为函数输入参数会不会引起函数效率低下?
https://github.com/JuliaLang/julia/issues/23338
额。。。看了一下题目,你问的是说用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 个赞