我正在使用Julia 0.4.7,因为我有一些旧代码,在我的应用程序中它比0.5.1更快。
我正在尝试计算Int
s 的长向量的经验 CDF。为此,我使用searchsortedlast(data, x)/n
,其中data
是一个排序Vector{Int}
,x
是一个Int
和n=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
单个动态调度,与搜索大型数组的成本相比,这是一个很小的成本。