如何改进函数的推理



我正在使用Julia 0.4.7,因为我有一些旧代码,在我的应用程序中它比0.5.1更快。

我正在尝试计算Ints 的长向量的经验 CDF。为此,我使用searchsortedlast(data, x)/n,其中data是一个排序Vector{Int}x是一个Intn=length(data)

我必须计算许多向量的 CDF,我发现这很慢。我认为速度减慢是因为推理在searchsortedlast的某个地方失败了(身体中有一个Any):

@code_warntype searchsortedlast(data, 2000)
Variables:
v::Array{Int64,1}
x::Int64
Body:
begin $(Expr(:line, 184, symbol("sort.jl"), symbol("")))
return (Base.Sort.searchsortedlast)(v::Array{Int64,1},x::Int64,(Base.Sort.ord)(Base.Sort.isless,Base.Sort.identity,false,Base.Sort.Forward)::Any)::Int64
end::Int64

我已经查看了searchsortedlast的源代码,但我无法弄清楚如何改进那里的推理(有许多方法定义让我感到困惑,但无论如何我并不是一个专业的 Julia 程序员)。也许我可以在某处注释一些东西,但不知道在哪里。谁能帮忙?

除了升级到 0.5 之外,您真的无能为力,问题已解决。 0.4 根本无法调度像 0.5 这样的函数类型,这就是ord调用类型不稳定的原因。

请注意,这种特定类型的不稳定性是无害的 — 由于函数的返回类型仍然稳定,因此唯一增加的成本是在每次调用时searchsortedlast单个动态调度,与搜索大型数组的成本相比,这是一个很小的成本。

相关内容

  • 没有找到相关文章

最新更新