朱莉娅:多参数的效率

mv3*_*mv3 3 performance multiple-dispatch julia

根据朱莉娅手册"性能提示"部分,不建议多次发送疯狂.我遇到了一种情况,我似乎需要为我定义的类型提供3个参数.这与我关于仅为2种可能类型使用1个参数的问题有关.我意识到我可以通过简单地使用另一个参数来解决那里出现的困难但是我的类型看起来像

type mytype{R<:Real, S<:Any, T<:Any}
   x::Matrix{R}
   y::Dict{Int64, Vector{S}}
   z::Dict{T, Vector{Int64}}
end
Run Code Online (Sandbox Code Playgroud)

这是一个不可取的性能中断,有几个参数可以发送.mytype上的函数然后将调度3个参数,函数参数是否正确?

Chr*_*kas 5

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

type mytype{R<:Real, S, T}
   x::Matrix{R}
   y::Dict{Int64, Vector{S}}
   z::Dict{T, Vector{Int64}}
end
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,你进行了一些非常重要的计算,严格的打字(在类型上)将有利于提高性能.如果您调用内联的小函数(在很多情况下它会在v0.5中自动执行,但您可以帮助它@inline),那么无论如何都可以免费调用函数并且您无需担心.

一如既往,以此为基准并亲眼看看.这里的问题主要来自大量的价值类型.

  • 是.该函数将专门处理它自己给出的类型,因此`function(n :: Int64)`将限制可以使用该函数的内容,但`function(n)`将调度和编译特定版本的` Int64`输入在性能方面也是如此. (3认同)
  • 过度指定或"严格打字"参数通常不会提高性能:http://docs.julialang.org/en/latest/manual/performance-tips/#type-declarations并且经常不鼓励,因为它可能会减少代码通用的.对行为调度和结构使用类型声明,而不是性能. (2认同)
  • 在函数上,是的,类型信息根本无法发送.类型是不同的:使所有那些"任何"和类型推断都不能很好地工作.使函数松散类型和类型严格. (2认同)

Lyn*_*ite 5

没关系.根据需要对类型执行尽可能多的调度.这就是它的用途.

你真的不想做什么; 以及文档的这一部分是什么,是对价值观的过多调度. 您可以通过使用Value作为类型参数来执行此操作.

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

以下是我的一些代码的示例,可以说是"太过分"以及调度值.它广泛使用了该Val{T}类型,该类型仅用于允许对值进行分派.它非常具有表现力,而且非常简洁,但它不会像使用条件或字典查找那样快速运行相同的代码.(这是我愿意做出的权衡,在这种情况下)

文档也在说明您不应该将值存储为自定义类型的类型参数.特别是如果你甚至不打算发送它们.这就是领域的用途.