"Templated"函数用于Julia

3

我有一个函数,基本上像一个查找表:

function lookup(a::Int64, x::Float64, y::Float64)

if a == 1
z = 2*x + y
else if a == 2
z = 5*x - 2*y
else if a == 3
...
end

return z

end

变量a实际上决定了z的关系。

然而,这个函数编译需要一段时间,并且在运行时效率也不是最高的。

你能为一个实例(比如a=1)编译函数lookup吗?不太可能这个函数会被调用所有可能的a函数。

我相信这样的功能类似于C++中的模板函数。


如果您想要更好的性能,就需要提供更高的上下文。通常选择a的值与选择函数所需的时间相同。后者将减少if的数量。提高性能的一般规则是减少条件(if)的数量。 - stefan bachert
1个回答

4

Julia的编译器只能基于参数类型来分派函数,而不是它们的值,因为值只有在运行时才知道。您可以通过创建“值类型”来进行欺骗,其中变量的不同值作为不同的类型:

lookup(::Type{Val{1}}, x, y) = 2x+y
lookup(::Type{Val{2}}, x, y) = 5x-2y
a = 2
lookup(Val{a}, 2, 3)
# 4

如果你想使用这种方法,你应该先阅读https://docs.julialang.org/en/stable/manual/performance-tips/#Types-with-values-as-parameters-1,以确保它不会导致类型稳定性问题。

我应该补充说明,我认为这个功能与C++中的模板函数的工作方式非常不同。 - Michael K. Borregaard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接