Timing R Chunk в R MarkDown / Notebook (эквивалент %% timeit в python)

Я ищу элегантный способ синхронизировать выполнение фрагмента R, предпочтительно запускать фрагмент несколько раз автоматически в фоновом режиме. (Волшебная функция %% timeit в записной книжке Python делает именно это)

Я знаю, что есть несколько способов синхронизировать функцию R или связку кода R, и есть несколько ТАК вопросы и по этому поводу. Все методы описаны в этой статье.

Однако большинство из них не реплицируют код r и те, которые имеют возможность репликации (например, system.time или mircobenchbark) идеально подходят для использования в функции, но не в фрагменте кода. (а может я не правильно понимаю)

tictoc работает очень хорошо для меня, за исключением того, что он дает запуск время только для одного выполнения, но у него нет возможности запускать как 1000 раз и усреднять время выполнения. (опять же, что делает %% timeit)


person PagMax    schedule 06.07.2017    source источник
comment
Просто заключите код в фигурные скобки { your code here }, и system.time или microbenchmark подойдут. Как и system.time({block of code}), это нормально, если он занимает несколько строк. Вы также можете обернуть его функцией и вызвать функцию по имени для более чистого интерфейса тестирования.   -  person lmo    schedule 06.07.2017
comment
Спасибо @lmo. Да, я думал, что это то, что нужно сделать. Я надеялся, что будет более элегантный способ. Рад получить это подтверждение сейчас.   -  person PagMax    schedule 06.07.2017
comment
Возможно, существует более интересный метод с пакетом, но я так делаю. Довольно просто реализовать. Вы можете взглянуть на пакет profVis. Если я правильно помню, он создает графики и так далее, что может быть привлекательно.   -  person lmo    schedule 06.07.2017


Ответы (1)


С tictoc можно записывать время в цикле и усреднять результаты.

library(tictoc)
tic.clearlog()
for (x in 1:10) {
    # passing x to tic() makes its value to become a label 
    # at time of the matching toc() call.
    tic(x)
    Sys.sleep(1)
    # When log = TRUE, toc() pushes the measured timing to a list
    # quiet = TRUE prevents from printing the timing
    toc(log = TRUE, quiet = TRUE)
}

Получить результаты toc() как форматированный текст для печати.

log.txt <- tic.log(format = TRUE)

Извлеките список, содержащий измерения в необработанном формате.

log.lst <- tic.log(format = FALSE)

Поскольку данные уже извлечены, очистите журнал tictoc.

tic.clearlog()

Преобразуйте элементы списка в тайминги. Каждый элемент списка имеет отметку времени начала (tic) и конца (toc).

timings <- unlist(lapply(log.lst, function(x) x$toc - x$tic))

Вычислите среднее время цикла.

mean(timings)
# [1] 1.001
person Sergei Izrailev    schedule 24.12.2017