【问题标题】:"Templated" functions for julia朱莉娅的“模板化”功能
【发布时间】:2017-08-31 14:15:17
【问题描述】:

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

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++ 中的模板函数。

【问题讨论】:

  • 如果你想要更好的表现,你需要给我们一个更高的上下文。一般来说,为a 选择一个值与选择一个函数所花费的时间相同。后者会减少 if 的数量。提高性能的一般规则是减少条件的数量 (if)。

标签: templates julia


【解决方案1】:

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++ 中模板化函数的工作方式完全不同。
猜你喜欢
  • 2018-03-25
  • 2018-11-27
  • 2014-04-26
  • 2020-07-18
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多