如何改进函数的推理

时间:2017-04-29 18:33:37

标签: julia type-inference cdf

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

我正在尝试计算Int s的长向量的经验CDF。为此,我使用的是searchsortedlast(data, x)/n,其中data是已排序的Vector{Int}xIntn=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的{​​{3}},但我无法弄清楚如何改进那里的推理(有很多方法定义让我困惑,但不是我是专家无论如何朱莉娅程序员)。也许我可以在某处注释某些东西,但不知道在哪里。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

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

请注意,这种特殊类型的不稳定性是无害的 - 因为函数的返回类型仍然是稳定的,唯一增加的成本是每次调用时searchsortedlast的单个动态调度,这是一个小成本比较以搜索大型阵列为代价。