朱莉娅的功能签名

戴维德

我有兴趣了解以下两个函数定义之间的实际差异(如果有)

function foo(n::Integer)
    println("hello")
end

function foo{T<:Integer}(n::T)
    println("hello")
end

据我了解,第二种形式在每次为新类型T调用函数时都会触发新的编译,但是在第一种情况下实际发生了什么?对第一种形式的性能有影响吗?

谢谢

点对点

函数参数上的参数用于方法歧义而不是性能。从文档http://docs.julialang.org/en/latest/manual/style-guide/#avoid-writing-overly-specific-types

要意识到的关键是,仅定义通用addone(x)= x + one(x)不会对性能造成任何影响,因为Julia会根据需要自动编译专用版本。例如,第一次调用addone(12)时,Julia将自动为x :: Int参数编译一个专门的addone函数,对one()的调用将替换为其内联值1。因此,addone的前三个定义以上是完全多余的。

编辑以解决评论:

这两个签名之间的区别实际上仅在存在多个参数时才明显

考虑以下两个功能:

julia> function foo(n::Integer, m::Integer)
           println(typeof(n), typeof(m))
       end

julia> function foo{T<:Integer}(n::T, m::T)
           println("Parameterized: ", typeof(n), typeof(m))
       end

在第一个函数中nm它们都必须是整数,但不必是整数的相同子类型。在第二个函数中,mn必须是相同的子类型

julia> foo(1, 2)
Parameterized: Int64Int64

julia> foo(1, Int32(1))
Int64Int32

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章