Julia等待函数完成,然后在循环中打印消息



我在Julia中有一个函数,它需要在循环中执行操作。一个参数被传递给循环,这个参数越大,函数的速度就越慢。我想得到一条消息来知道它在哪个迭代中,但Julia似乎在等待整个函数完成后再打印任何内容。我是Julia 1.4。Julia 1.3没有出现这种行为。一个例子是这样的

function f(x)
rr=0.000:0.0001:x
aux=0
for r in rr
print(r, " ")
aux+=veryslowfunction(r)
end
return aux
end

实际上,f在被调用时,在完成之前不会打印任何内容。

您需要在print命令后添加:

flush(stdout)

解释

进程的标准输出通常是缓冲的。特定的缓冲区大小和行为将取决于您的系统设置,也许还取决于终端类型。通过刷新缓冲区,可以确保内容实际发送到终端。

或者,您也可以使用ProgressLogging.jl(需要TerminalLoggers.jl才能看到实际输出(或ProgressMeter.jl这样的库,它将在循环的每个步骤中自动更新格式良好的状态栏。

例如,对于ProgressMeter,对的调用

function f(x)
rr=0.000:0.0001:x
aux=0
@showprogress for r in rr
aux += veryslowfunction(r)
end
return aux
end

将显示以下内容(最终(:

Progress: 100%|██████████████████████████████████████████████████████████████| Time: 0:00:10

同样,我无法在我的终端中重现行为(它总是打印(,但我想补充一点,对于这些类型的情况,@show宏非常整洁:

julia> function f(x)
rr=0.000:0.0001:x
aux=0
for r in rr
@show r
aux+=veryslowfunction(r)
end
return aux
end
f (generic function with 1 method)
julia> f(1)
r = 0.0
r = 0.0001
r = 0.0002
...

它在引擎盖下使用println

julia> using MacroTools
julia> a = 5
5
julia> prettify(@expand(@show a))
quote
Base.println("a = ", Base.repr($(Expr(:(=), :ibex, :a))))
ibex
end

最新更新