首页 > 解决方案 > @code_warntype 返回类型不稳定性:AbstractArray{T,1}

问题描述

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

标签: julia

解决方案


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

  • 首先是索引:%1 = invoke Base.getindex——这是在做索引。它可以返回任何类型的向量。这确实是类型不稳定的。
  • 然后是 typeassert: (Core.typeassert)(%1, Array{Float64,1})— 这确保 getindex 返回(in %1)是 a Vector{Float64}。如果不是,Julia 会抛出一个错误。
  • 现在得到了回报:%3 = π (%1, Array{Float64,1})- 现在可以将向量视为 a Vector{Float64},因为其他所有类型都会导致错误。从这里开始,向量的计算应该是类型稳定的。

添加这样的类型断言并不能从根本上“修复”不稳定性,它们只是对其进行修补,因此之后的一切都很快。


推荐阅读