如何使用 map 等 while 条件制作类型稳定的生成器?
How to make type stable generator with a while condition like map?
假设我正在模拟一个实验,但我不知道该步骤何时终止。使用 while
条件并推送到 Any
数组,函数类型不稳定。
function simulate()
result = []
alive = true
while alive
push!(result,alive)
alive = rand(Bool)
end
return result
end
有没有办法以类型稳定的方式完成此操作?
在这种特殊情况下有一个非常简单的修复方法!你可以指定一个空的 Array{Bool}
而不是你当前得到的 Array{Any}
,只需写 Bool[]
代替 []
:
function simulate()
result = Bool[]
alive = true
while alive
push!(result,alive)
alive = rand(Bool)
end
return result
end
查看此修改函数的 @code_warntype
的输出,我们可以看到结果现在被稳定地推断为 Vector{Bool}
julia> @code_warntype simulate()
MethodInstance for simulate()
from simulate() in Main at REPL[13]:1
Arguments
#self#::Core.Const(simulate)
Locals
alive::Bool
result::Vector{Bool}
Body::Vector{Bool}
1 ─ (result = Base.getindex(Main.Bool))
│ Main.sizehint!(result, 50)
└── (alive = true)
2 ┄ goto #4 if not alive
3 ─ Main.push!(result, alive::Core.Const(true))
│ (alive = Main.rand(Main.Bool))
└── goto #2
4 ─ return result
假设我正在模拟一个实验,但我不知道该步骤何时终止。使用 while
条件并推送到 Any
数组,函数类型不稳定。
function simulate()
result = []
alive = true
while alive
push!(result,alive)
alive = rand(Bool)
end
return result
end
有没有办法以类型稳定的方式完成此操作?
在这种特殊情况下有一个非常简单的修复方法!你可以指定一个空的 Array{Bool}
而不是你当前得到的 Array{Any}
,只需写 Bool[]
代替 []
:
function simulate()
result = Bool[]
alive = true
while alive
push!(result,alive)
alive = rand(Bool)
end
return result
end
查看此修改函数的 @code_warntype
的输出,我们可以看到结果现在被稳定地推断为 Vector{Bool}
julia> @code_warntype simulate()
MethodInstance for simulate()
from simulate() in Main at REPL[13]:1
Arguments
#self#::Core.Const(simulate)
Locals
alive::Bool
result::Vector{Bool}
Body::Vector{Bool}
1 ─ (result = Base.getindex(Main.Bool))
│ Main.sizehint!(result, 50)
└── (alive = true)
2 ┄ goto #4 if not alive
3 ─ Main.push!(result, alive::Core.Const(true))
│ (alive = Main.rand(Main.Bool))
└── goto #2
4 ─ return result