@code_warntype возвращает нестабильность типа: AbstractArray {T, 1} - PullRequest
1 голос
/ 28 марта 2019

При попытке очистить код с помощью @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 Ответ

2 голосов
/ 28 марта 2019

Это распечатка точно так, как я ожидал. Здесь происходят три вещи:

  • Сначала индексация: %1 = invoke Base.getindex - это индексация. Он может вернуть вектор любого типа. Это действительно нестабильный тип.
  • Затем typeassert: (Core.typeassert)(%1, Array{Float64,1}) - это гарантирует, что возвращаемое getindex (в %1) будет Vector{Float64}. Если это не так, Джулия выдаст ошибку.
  • А теперь выплата: %3 = π (%1, Array{Float64,1}) - теперь этот вектор можно считать Vector{Float64}, поскольку любой другой тип приведет к ошибке. С этого момента вычисления с вектором должны быть стабильными по типу.

Добавление таких утверждений типа не «исправляет» нестабильность в корне, они просто исправляют ее, чтобы потом все было быстро.

...