@code_warntype返回类型不稳定:AbstractArray {T,1}

时间:2019-03-28 16:19:10

标签: julia

当尝试使用@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})

1 个答案:

答案 0 :(得分:2)

这完全符合我的预期。这里发生了三件事:

  • 首先建立索引:%1 = invoke Base.getindex —这是在建立索引。它可以返回任何类型的向量。这确实是类型不稳定的。
  • 然后输入typeassert:(Core.typeassert)(%1, Array{Float64,1}) —这可以确保get {%1中返回的getindex是Vector{Float64}。如果不是,Julia将抛出错误。
  • 现在的收益是:%3 = π (%1, Array{Float64,1}) —现在可以将向量视为Vector{Float64},因为其他所有类型都会导致错误。从现在开始,使用向量的计算应该是类型稳定的。

添加这样的类型断言并不能从根本上“解决”不稳定问题,它们只是对其进行修补,因此以后的所有操作都很快。