2017-08-31 61 views
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的關係是什麼。

然而,這個函數需要一段時間才能編譯,而且在運行時也不是最有效的。

你能編譯函數lookup只有一個(說a = 1)的實例嗎?這個函數不太可能要求a的所有可能的功能。

我相信這樣的功能將類似於C++中的模板化函數。

+0

如果你想要更好的表現,你需要給我們更高的上下文。一般情況下,選擇一個「a」的值與選擇一個函數的時間相同。後者會減少'if'的數量。性能提高的一般規則是減少條件數量('if')。 –

回答

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,以確保它不會造成類型穩定性問題。

+0

我應該補充一點,我相信這個功能與模板化函數在C++中的工作方式有很大不同。 –