Время выполнения функции измерения в R - PullRequest
247 голосов
/ 07 июня 2011

Существует ли стандартизированный способ R измерения времени выполнения функции?

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


Кажется, я помню, что когда-то использовал что-то вроде ниже:

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction

Ответы [ 10 ]

226 голосов
/ 23 июля 2013

Другой возможный способ сделать это - использовать Sys.time ():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

Не самый элегантный способ сделать это, по сравнению с приведенным выше ответом, но, безусловно, способ сделать это.

167 голосов
/ 07 июня 2011

Встроенная функция system.time() сделает это.

Используйте как: system.time(result <- myfunction(with, arguments))

56 голосов
/ 07 июня 2011

Как сказала Андри, system.time() отлично работает.Для короткой функции я предпочитаю поставить replicate() в нем:

system.time( replicate(10000, myfunction(with,arguments) ) )
36 голосов
/ 07 июня 2011

Немного более приятный способ измерения времени выполнения - использовать пакет rbenchmark .Этот пакет (легко) позволяет вам указать, сколько раз будет повторяться ваш тест, и каким должен быть относительный тест.

См. Также связанный вопрос на stats.stackexchange

30 голосов
/ 26 ноября 2014

Существует также proc.time()

Вы можете использовать так же, как Sys.time, но это дает вам результат, аналогичный system.time.

ptm <- proc.time()
#your function here
proc.time() - ptm

основное различие между использованием

system.time({ #your function here })

заключается в том, что метод proc.time() по-прежнему выполняет вашу функцию, а не просто измеряет время ... и, кстати, мне нравится использовать system.time с {} внутри, чтобы вы могли поместить набор вещей ...

24 голосов
/ 06 июня 2017

microbenchmark - это легкий (~ 50 КБ) пакет, более или менее стандартный способ в R для сравнения нескольких выражений и функций:

microbenchmark(myfunction(with,arguments))

Например:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

Здесь оба выражения были оценены 10000 раз, со средним временем выполнения около 25-30 нс.

22 голосов
/ 27 октября 2015

Пакет "Tictoc" дает вам очень простой способ измерения времени выполнения.Документация находится в: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf.

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

Чтобы сохранить прошедшее время в переменной, вы можете сделать:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic
15 голосов
/ 03 июня 2016

Хотя другие решения полезны для одной функции, я рекомендую следующий фрагмент кода, где он более общий и эффективный:

Rprof ( tf <- "log.log",  memory.profiling = TRUE )
your code must be in between
Rprof ( NULL ) ; print ( summaryRprof ( tf )  )
11 голосов
/ 07 июня 2011

Вы можете использовать функции MATLAB tic - toc, если хотите. Посмотрите этот другой вопрос

Функция секундомера в R

9 голосов
/ 19 апреля 2018

Другой простой, но очень мощный способ сделать это - использовать пакет profvis.Он не только измеряет время выполнения вашего кода, но и позволяет детализировать каждую выполняемую вами функцию.Его можно использовать и для Shiny.

library(profvis)

profvis({
  #your code here
})

Нажмите здесь для некоторых примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...