我在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