gpt4 book ai didi

julia - Julia 中的函数签名

转载 作者:行者123 更新时间:2023-12-04 19:03:39 28 4
gpt4 key购买 nike

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

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

The key thing to realize is that there is no performance penalty to defining only the general addone(x) = x + one(x), because Julia will automatically compile specialized versions as needed. For example, the first time you call addone(12), Julia will automatically compile a specialized addone function for x::Int arguments, with the call to one() replaced by its inlined value 1. Therefore, the first three definitions of addone above are completely redundant.



编辑以解决评论:

两个签名之间的差异只有在有多个参数时才真正明显

考虑两个函数:
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

关于julia - Julia 中的函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30876384/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com