带有符号的通用调度

Posted

技术标签:

【中文标题】带有符号的通用调度【英文标题】:Generic dispatch with Symbols 【发布时间】:2017-01-11 21:35:25 【问题描述】:

我想知道是否有一种方法可以使用符号进行多次分派,但还包括一个“包罗万象的方法”。即类似

function dispatchtestalg<:Symbol(T::TypeValalg)
  println("This is the generic dispatch. The algorithm is $alg")
end
function dispatchtest(T::TypeVal:Euler)
  println("This is for the Euler algorithm!")
end

第二个有效并且与手册中的内容相匹配,我只是想知道您如何使第一个有效。

【问题讨论】:

是否对具有相同兴趣的元素 Val(alg)(而不是类型 Valalg)进行调度? 这不再有趣了。这是 DiffEq 的第一个设计,但现在我们使用类型。这些天我会说最好使用类型,因为无论如何你都会限制选择来编写调度。如果您确实想使用 Val,最好在 v1.0 中调度元素,因为常量 prop 会启动,它会被推断出来。所以这个问题完全是过去式了。 【参考方案1】:

你可以这样做:

julia> function dispatchtestalg(::TypeValalg)
           println("This is the generic dispatch. The algorithm is $alg")
       end
dispatchtest (generic function with 1 method)

julia> dispatchtest(alg::Symbol) = dispatchtest(Valalg)
dispatchtest (generic function with 2 methods)

julia> function dispatchtest(::TypeVal:Euler)
           println("This is for the Euler algorithm!")
       end
dispatchtest (generic function with 3 methods)

julia> dispatchtest(:Foo)
This is the generic dispatch. The algorithm is Foo

julia> dispatchtest(:Euler)
This is for the Euler algorithm!

【讨论】:

请注意,这样做的性能可能不如仅使用 if-else 语句来检查特定符号值,并且也比在字典中查找符号慢,因此实际上没有很好的用例。如果不需要可扩展性,请使用 if-else;如果您确实需要可扩展性,请使用字典。 您能否为我们提供一个很好的值类型用例? Chris 确实需要可扩展性。您的意思是改用全局字典吗?如果我理解正确的话,这可能是预编译的问题。 它如何影响性能实际上取决于该功能的成本。在我的情况下,这些功能非常昂贵,如果不是成千上万次,if-else 语句会不会是数千次,否则调度的价格是一次支付(而且它微不足道,与分钟相比可能以微秒为单位衡量 /实际函数调用的小时数)。我发现这个解决方案在这种情况下确实有助于提高性能。与往常一样,针对您的具体情况进行基准测试。 @StefanKarpinski if-else 是为自定义类型定义 getproperty 的推荐方法吗?是否会在编译时忽略分支(因为编译器原则上知道实际使用了哪个符号)?

以上是关于带有符号的通用调度的主要内容,如果未能解决你的问题,请参考以下文章

Latex符号表——文本/数学模式通用符号

Latex符号表——文本/数学模式通用符号

oozie调度sqoop脚本时操作符号替换

考虑到货币符号的数字的通用转换

+- Scala 中的通用声明中的符号

原生 C 有共同的符号吗?