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个参数,函数参数是否正确?
没关系.请注意,您可以将其写为:
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),那么无论如何都可以免费调用函数并且您无需担心.
一如既往,以此为基准并亲眼看看.这里的问题主要来自大量的价值类型.
没关系.根据需要对类型执行尽可能多的调度.这就是它的用途.
你真的不想做什么; 以及文档的这一部分是什么,是对价值观的过多调度. 您可以通过使用Value作为类型参数来执行此操作.
对值进行调度往往会产生(通常)导致动态调度的问题.这意味着调用具有值作为类型参数的函数的函数不能通过知道它将调用哪个函数来专门化.这与类型不稳定性密切相关.它可以杀死很多优化器,并使julia像python一样运行缓慢.
以下是我的一些代码的示例,可以说是"太过分"以及调度值.它广泛使用了该Val{T}类型,该类型仅用于允许对值进行分派.它非常具有表现力,而且非常简洁,但它不会像使用条件或字典查找那样快速运行相同的代码.(这是我愿意做出的权衡,在这种情况下)
文档也在说明您不应该将值存储为自定义类型的类型参数.特别是如果你甚至不打算发送它们.这就是领域的用途.
| 归档时间: |
|
| 查看次数: |
338 次 |
| 最近记录: |