我有一个基本上充当查找表的函数:

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的一个实例(例如a = 1)编译函数lookup?该函数不太可能会调用a的所有可能函数。

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

最佳答案

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,以确保它不会引起类型稳定性问题。

09-09 23:46
查看更多