Юлия ждет завершения функции до sh, прежде чем печатать сообщение в цикле - PullRequest
5 голосов
/ 02 апреля 2020

У меня есть функция в Джулии, которая требует, чтобы все делалось в oop. Параметр передается в l oop, и чем больше этот параметр, тем медленнее становится функция. Я хотел бы получить сообщение, чтобы узнать, в какой итерации это происходит, но похоже, что Джулия ждет завершения всей функции, прежде чем что-то печатать. Это Юлия 1.4. Такого поведения не было у Юлии 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 при вызове ничего не печатает, пока не завершит работу.

Ответы [ 3 ]

6 голосов
/ 02 апреля 2020

Вы должны добавить после команды print:

flush(stdout)

Пояснение

Стандартный вывод процесса обычно буферизуется. Конкретный размер буфера и его поведение будут зависеть от настроек вашей системы и, возможно, типа терминала. Очистив буфер, вы убедитесь, что содержимое действительно отправлено на терминал.

2 голосов
/ 02 апреля 2020

В качестве альтернативы, вы также можете использовать библиотеку, такую ​​как ProgressLogging.jl (требуется TerminalLoggers.jl, чтобы увидеть фактический вывод), или ProgressMeter.jl , которая автоматически обновит красиво отформатированный строка состояния на каждом шаге l oop.

Например, при 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
0 голосов
/ 02 апреля 2020

Опять же, я не могу воспроизвести поведение в моем терминале (оно всегда печатается), но я хотел добавить, что для таких типов ситуаций @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

...