Templates &引用;模板化;朱莉娅的函数

Templates &引用;模板化;朱莉娅的函数,templates,julia,Templates,Julia,我有一个函数,基本上用作查找表: 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的一个实例编译函数lookup(假设a=1)?不太可能对a的所有可能函数调用此函数 我

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

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


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

< P>朱丽亚的编译器只能对参数类型进行调度,而不是它们的值,因为值只在运行时知道。您可以通过创建“值类型”来进行一些欺骗,其中变量的不同值充当不同的类型:

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

如果你想使用这种方法,你应该先阅读,以确保它不会产生类型稳定性的问题。

我应该补充一下,我相信这个功能与模板化函数在C++中的工作方式有很大的不同。如果你想要更好的性能,你需要给我们一个更高的上下文。通常,为
a
选择一个值与选择一个函数的时间相同。如果,则后者将减少
的数量。提高性能的一般规则是减少条件的数量(
if
)。