Function 朱莉娅:效率和指示参数类型

Function 朱莉娅:效率和指示参数类型,function,methods,types,julia,Function,Methods,Types,Julia,关于指定函数参数和输出的类型,我有三个相关的问题。我定义了一个函数f,我希望调用多次,所以我希望尽可能提高效率。我的函数定义如下所示: function f(x, y) ... return z end 我知道x将是一个数组{Float64,1},y将是一个数组{Float64,2},z将是一个Float64 我的问题是: 指定输入类型是否有效率优势 在函数定义中,即函数f(x::Array{Float64},y::Array{Float64}) 通过指定x是一维的而y是二维的

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

function f(x, y)
    ...
    return z
end
我知道
x
将是一个数组{Float64,1},
y
将是一个数组{Float64,2},
z
将是一个Float64

我的问题是:

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

  • 非常感谢!如果这些问题以前已经解决过,请道歉。

    。Julia的美妙之处在于它的编译器能够很好地为您快速地解决这些问题。这里是寻找如何编写高效代码的最佳场所,比如确保您的函数是有效的。

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

    vs


    如果要这样做,至少应该给出不会过度压缩函数的类型注释(例如
    函数f(x::AbstractVector,y::AbstractMatrix)
    )。否则,您的函数将无法与其他元素类型一起工作,这可能非常有用。人类在“动态地解决这些问题”方面不如编译器。对于一个非常重要的项目,将有多人试图理解代码库。这几乎像是支持
    f的论点(x,y)
    。这非常容易阅读。记录函数参数的更好方法是使用。正如@OscarSmith提到的,很容易意外地过度限制函数的输入和输出类型。当然,
    f(x)
    更容易阅读(哦,顺便说一句,x是tuple
    tuple{x::Array{Float64,1},y::Array){Float64,2}
    )。理解有点困难。函数参数注释用于方法分派,而不是文档。docstring用于文档。有一个小问题-指定函数参数类型的方式可能会影响编译时间。
    function f(x, y)
    
    function f(x::Array{Float64}, y::Array{Float64})::Float64