Julia:多参数效率

Julia: Efficiency of Multiple Parameters

根据"performace tips" section of the Julia manual it is not advisable to go crazy with multiple dispatch. I've run into a situation where it seems I need 3 parameters for a type I'm defining. This is related to my question about 。我意识到我可以通过简单地使用另一个参数来解决那里出现的困难,但我的类型看起来像

type mytype{R<:Real, S<:Any, T<:Any}
   x::Matrix{R}
   y::Dict{Int64, Vector{S}}
   z::Dict{T, Vector{Int64}}
end

对于要分派的多个参数,这在性能方面是不可取的吗?然后 mytype 上的函数将分派 3 个参数,函数参数是否正确?

没关系。请注意,您可以将其写为:

type mytype{R<:Real, S, T}
   x::Matrix{R}
   y::Dict{Int64, Vector{S}}
   z::Dict{T, Vector{Int64}}
end

在大多数情况下,当您进行大量计算时,严格类型化(针对类型)将有利于提高性能。如果你调用的是内联的小函数(在很多情况下它会在 v0.5 中自动调用,但你可以使用 @inline 来帮助它),那么无论如何函数调用都没有成本而且你担心没什么。

一如既往,对其进行基准测试并亲眼看看。这里的问题主要来自于大量的值类型。

没关系。 根据需要对 Types 进行多次分派。 这就是它的用途。

你不是很想做的事;文档的那部分内容是对 Values. 的调度过多 您可以使用 Value 作为类型参数。

对值进行分派往往会出现这样的问题,即它(通常)会导致动态分派。 这意味着调用具有值作为类型参数的函数的函数无法通过知道它将调用哪个函数来专门化。 这与类型不稳定性密切相关。 它可以杀死很多优化器,并使 julia 运行 像 python 一样慢。

Here is 我的一些代码示例,可以说 "too far" 与值调度有关。 它广泛使用 Val{T} 类型,该类型仅用于允许按值调度。 它非常有表现力,也非常简洁,但它不会 运行 与使用条件语句或字典查找的相同代码一样快。 (在这种情况下,这是我愿意做出的权衡)

文档还指出您不应将值存储为自定义类型的类型参数。特别是如果你甚至不打算派遣他们。这就是字段的用途。