gpt4 book ai didi

julia - 解释来自@code_warntype 的 Body 表达式

转载 作者:行者123 更新时间:2023-12-05 00:55:34 24 4
gpt4 key购买 nike

如果我们运行:

@code_warntype deepcopy(rand(2))

在 Julia REPL 中,输出包含 Body 表达式中的标记值。具体来说,两个 Any在......的最后:
Body:
begin # deepcopy.jl, line 8:
GenSym(0) = (Base.Array)(Base.Any,32)::Array{Any,1}
return (Base.deepcopy_internal)(x::Array{Float64,1},$(Expr(:new, :((top(getfield))(Base,:ObjectIdDict)::Type{ObjectIdDict}), GenSym(0))))::Any
end::Any

我从 this question 了解到如果我们主要关心的是类型不稳定,我们通常不需要担心 Body 表达式中的标记值。所以相反,我的问题是:

为什么来自 Base 的一个相当简单的函数在 @code_warntype 中生成任何标记值?我确信有充分的理由,但我是解释 @code_warntype 输出的新手。 ,并且在理解官方文档中对 Body 表达式的讨论时遇到了一些麻烦。

最佳答案

这是类型推断无法确定函数的返回类型的情况的示例。 (注意返回值上的 ::Any!)它 一个问题,不是因为计算本身会因为类型不稳定而变慢,而是因为无法推断返回类型,因此使用返回类型的 future 计算将受到类型不稳定的影响。

您可以通过查看下面的分配来看到这种效果:

julia> function f()
y = rand(10)
@time y[1] + y[10]
z = deepcopy(y)
@time z[1] + z[10]
end
f (generic function with 1 method)

julia> f(); # ignore output here on first compile

julia> f();
0.000000 seconds
0.000002 seconds (3 allocations: 48 bytes)

请注意,第二个操作需要分配并花费时间,因为涉及拆箱和动态调度。

在将成为 0.5(可能会在几个月内发布)的当前每晚构建中,这是 fixed .因此
julia> @code_warntype deepcopy(rand(2))
Variables:
#self#::Base.#deepcopy
x::Array{Float64,1}

Body:
begin # deepcopy.jl, line 8:
# meta: location dict.jl Type # dict.jl, line 338:
SSAValue(1) = (Core.ccall)(:jl_alloc_array_1d,(Core.apply_type)(Core.Array,Any,1)::Type{Array{Any,1}},(Core.svec)(Core.Any,Core.Int)::SimpleVector,Array{Any,1},0,32,0)::Array{Any,1}
# meta: pop location
return (Core.typeassert)((Base.deepcopy_internal)(x::Array{Float64,1},$(Expr(:new, :(Base.ObjectIdDict), SSAValue(1))))::Any,Array{Float64,1})::Array{Float64,1}
end::Array{Float64,1}

没有类型不稳定性,并且
julia> f()
0.000000 seconds
0.000000 seconds

它没有动态调度和分配。

关于julia - 解释来自@code_warntype 的 Body 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37872601/

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