【问题标题】:Julia: Efficiency of Multiple ParametersJulia:多参数的效率
【发布时间】:2017-03-10 21:17:28
【问题描述】:

根据"performace tips" section of the Julia manual,不建议疯狂地进行多次调度。我遇到了一种情况,似乎我需要 3 个参数来定义我定义的类型。这与我关于using only 1 parameter for 2 possible types 的问题有关。我意识到我可以通过简单地使用另一个参数来解决那里出现的困难,但是我的类型看起来像

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

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

【问题讨论】:

    标签: performance julia multiple-dispatch


    【解决方案1】:

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

    你不想做的事;文档的那部分内容是关于 Values 的过多调度。 您可以通过使用 Value 作为类型参数来做到这一点。

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

    Here is 是我的一些代码的示例,可以说在值调度方面“太过分”了。 它广泛使用了Val{T} 类型,该类型的存在仅用于允许按值调度。 它非常有表现力,也非常简洁,但它不会像使用条件或字典查找的相同代码那样运行得那么快。 (在这种情况下,这是我愿意做出的权衡)

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

    【讨论】:

    • 好的,谢谢,我将不得不阅读更多关于此的细节(类型与值)。你注意到我这次用了 2 个问题吗?)
    【解决方案2】:

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

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

    在大多数情况下,当您进行大量计算时,严格类型(在类型上)对性能有好处。如果您正在调用内联的小函数(在许多情况下,它会在 v0.5 中自动执行,但您可以使用 @inline 来帮助它),那么函数调用无论如何都没有成本,您无需担心任何事情。

    与往常一样,对其进行基准测试并亲自查看。这里的问题主要来自大量的值类型。

    【讨论】:

    • 过度指定或“严格键入”参数通常不会提高性能:docs.julialang.org/en/latest/manual/performance-tips/… 并且通常不鼓励使用,因为它可能会使代码不那么通用。将类型声明用于行为调度和结构,而不是性能。
    • 在函数上,是的,类型信息根本无助于调度。类型不同:使所有这些 Any 和类型推断将无法正常工作。使函数类型松散,类型严格。
    • 是的。该函数将专注于自己赋予它的类型,因此function(n::Int64) 将限制可以使用该函数的内容,但function(n) 将为Int64 输入分派和编译特定版本,因此在性能方面它是一样。
    • @ChrisRackauckas 这真的很高兴知道,而不是我以前真正理解的东西。我是 Julia 的新手(来自 matlab、python 和一点点 c++),到目前为止我真的很喜欢它,感谢所有帮助
    • 请注意,function foo{R&lt;:Real}(n::Vector{R}) 的性能比function foo(n::Vector{Real}) 好得多。 (但function bar(n::Real)function bar{R&lt;:Real}(n::R) 相同)。这有点像@ChrisRackauckas 所针对的类型。
    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 2017-04-09
    • 2022-08-14
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多