【问题标题】:Julia: Efficiency and indicating argument typesJulia:效率和指示参数类型
【发布时间】:2021-07-07 13:27:36
【问题描述】:

我有三个有关指定函数参数和输出类型的相关问题。我正在定义一个我希望多次调用的函数 f,所以我希望尽可能地提高效率。我的函数定义如下所示:

function f(x, y)
    ...
    return z
end

我知道x 将是一个数组{Float64,1},y 将是一个数组{Float64,2},z 将是一个 Float64。

我的问题是:

  1. 指定输入类型是否有效率优势 在函数定义中,即function f(x::Array{Float64}, y::Array{Float64})?
  2. 通过指定x 是一维的而y 是二维的,即function f(x::Array{Float64,1}, y::Array{Float64,2}),使类型更具体有什么额外的好处吗?
  3. 指定z 的类型(即function f(x::Array{Float64,1}, y::Array{Float64,2})::Float64)是否有任何效率优势?

非常感谢!如果之前已经解决了这些问题,我们深表歉意。

【问题讨论】:

    标签: function methods types julia


    【解决方案1】:

    对于代码的人类阅读者来说,这是一个巨大的好处。考虑第一次人类阅读的差异(或者可能在远离代码很长时间之后):

    function f(x, y)
    

    对比

    function f(x::Array{Float64}, y::Array{Float64})::Float64
    

    【讨论】:

    • 如果你想这样做,你至少应该给出不会过度限制函数的类型注释(例如function f(x::AbstractVector, y::AbstractMatrix))。否则您的函数将无法与其他元素类型一起使用,这可能非常有用。
    • 在“即时解决这些问题……”方面,人类不如编译器好。对于一个不平凡的项目,将有多个人试图理解代码库。
    • 这看起来像是支持f(x, y) 的论据。它更容易阅读。记录函数参数的更好方法是使用docstrings。正如@OscarSmith 所提到的,很容易意外地过度限制函数的输入和输出类型。
    • 当然,f(x) 更容易阅读(哦,顺便说一句,x 是元组 Tuple{x::Array{Float64,1}, y::Array{Float64,2})。理解起来有点困难。
    • 函数参数注释用于方法调度,而不是文档。文档字符串用于文档。
    【解决方案2】:

    In general, no (to all questions)。 Julia 的美妙之处在于它的编译器非常擅长即时为您解决这些问题。 performance tips 是寻找如何编写高效代码的最佳位置,例如确保您的函数是 type-stable

    【讨论】:

    • 有一个小怪癖 - 指定函数参数类型的方式可能会影响编译时间。
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2023-03-09
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2020-01-24
    相关资源
    最近更新 更多