当尝试使用@code_warntype清理代码时,我得到::AbstractArray{T,1}
的类型不稳定,这是不期望的。
数据帧是函数FUNC1
的自变量,函数中使用其中的特定COLUMN
。我已经在函数内将此COLUMN
的类型定义为Array {Float64,1}。但是,当我在函数上运行@code_warntype时,::AbstractArray{T,1}
会出现在输出中。
function FUNC1(df::DataFrame)
df_COL=df[:COLUMN]::Array{Float64,1}
.......
end
预期结果是应该没有类型不稳定,因为已经为该列指定了类型。
实际结果:
Body::Tuple{Float64,Float64}
│ 159 1 ── %1 = invoke Base.getindex(_2::DataFrame, :COLUMN::Symbol)::AbstractArray{T,1} where T
│ │ (Core.typeassert)(%1, Array{Float64,1})
│ │ %3 = π (%1, Array{Float64,1})
答案 0 :(得分:2)
这完全符合我的预期。这里发生了三件事:
%1 = invoke Base.getindex
—这是在建立索引。它可以返回任何类型的向量。这确实是类型不稳定的。(Core.typeassert)(%1, Array{Float64,1})
—这可以确保get {%1
中返回的getindex是Vector{Float64}
。如果不是,Julia将抛出错误。%3 = π (%1, Array{Float64,1})
—现在可以将向量视为Vector{Float64}
,因为其他所有类型都会导致错误。从现在开始,使用向量的计算应该是类型稳定的。添加这样的类型断言并不能从根本上“解决”不稳定问题,它们只是对其进行修补,因此以后的所有操作都很快。