julia - @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})
解决方案
这完全符合我的预期。这里发生了三件事:
- 首先是索引:
%1 = invoke Base.getindex
——这是在做索引。它可以返回任何类型的向量。这确实是类型不稳定的。 - 然后是 typeassert:
(Core.typeassert)(%1, Array{Float64,1})
— 这确保 getindex 返回(in%1
)是 aVector{Float64}
。如果不是,Julia 会抛出一个错误。 - 现在得到了回报:
%3 = π (%1, Array{Float64,1})
- 现在可以将向量视为 aVector{Float64}
,因为其他所有类型都会导致错误。从这里开始,向量的计算应该是类型稳定的。
添加这样的类型断言并不能从根本上“修复”不稳定性,它们只是对其进行修补,因此之后的一切都很快。
推荐阅读
- javascript - Flask:如何更改render_template中传递的值
- python - 在 Python 中重新编码变量,类似于 R ifelse
- javascript - 如何在 javascript 中使用正则表达式从另一个字符串中获取特定字符串
- javascript - React Native FlatList 组件没有渲染我的数组
- javascript - 使用 Fetch 流式传输音频
- google-cloud-platform - 如何找到 Airflow 后端数据库的架构?
- cmake - add_subdirectory 两次具有不同的属性
- c - 有人可以指出我的代码中的错误吗
- laravel - Laravel - 在 Eloquent 模型上调用 query() 方法有什么好处
- python - readline().strip() 的目的是什么?