col*_*ang 5 julia type-stability
说,我有一个类型层次结构
abstract A
immutable B <: A end
immutable C <: A end
Run Code Online (Sandbox Code Playgroud)
A以下工厂模式的构造函数:
function A(x::Int)
if x > 0
B()
else
C()
end
end
Run Code Online (Sandbox Code Playgroud)
它根据预期的输入返回不同的子类型.但是,它也是类型不稳定,因为我找不到强制返回类型的方法A.
那么,这里有工厂模式是不是很糟糕?类型不稳定性是否仅影响不可变类型而不是可变类型,因为后者无论如何都是引用类型.
我必须为此选择参数类型吗?
immutable D{T <: A}
type::T
end
function D(x::Int)
if x > 0
D(B())
else
D(C())
end
end
Run Code Online (Sandbox Code Playgroud)
感觉有点糟糕.
实际上,类型不稳定的功能有多糟糕?是否值得交易以获得更好的代码可读性?
或者,我应该定义typealias A Union{B,C}吗?
好吧,你可以这样做:
function A(x::Int)
if x > 0
B()::A
else
C()::A
end
end
Run Code Online (Sandbox Code Playgroud)
但它没有帮助:
julia> @code_warntype A(5)
Variables:
x::Int64
Body:
begin # none, line 2:
unless (Base.slt_int)(0,x::Int64)::Bool goto 0 # none, line 3:
return $(Expr(:new, :((top(getfield))(Main,:B)::Type{B})))
goto 1
0: # none, line 5:
return $(Expr(:new, :((top(getfield))(Main,:C)::Type{C})))
1:
end::Union{B,C}
Run Code Online (Sandbox Code Playgroud)
您无法创建抽象类型的实例.此外,在当前的julia中,任何抽象类型都自动"类型不稳定",这意味着编译器无法为其生成优化代码.因此,没有"强制返回类型为A",然后以某种方式使函数类型稳定(从获得良好性能的意义上).
您可以实现类型稳定的工厂模式,但输出类型应由输入类型决定,而不是由输入值决定.例如:
A(x::Vector) = B()
A(x::Matrix) = C()
Run Code Online (Sandbox Code Playgroud)
是A层次结构对象的类型稳定构造函数.
如果没有明显的类型来表示您的意图,您可以随时使用Val:
A(x, ::Type{Val{1}}) = B()
A(x, ::Type{Val{2}}) = C()
A(1, Val{1}) # returns B()
A(1, Val{2}) # returns C()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |