Есть ли функция таймера R или секундомера, аналогичная MATLAB tic/toc?
Функция секундомера в R
Ответ 1
В R есть много инструментов для профилирования, как сказал Дирк. Если вы хотите простоту tic/toc, то вы можете сделать это и в R.
EDIT: я уничтожил функцию сбора мусора из пакета MATLAB, а tic
теперь позволяет вам выбирать, интересуетесь ли вы полным временем или просто временем пользователя.
tic <- function(gcFirst = TRUE, type=c("elapsed", "user.self", "sys.self"))
{
type <- match.arg(type)
assign(".type", type, envir=baseenv())
if(gcFirst) gc(FALSE)
tic <- proc.time()[type]
assign(".tic", tic, envir=baseenv())
invisible(tic)
}
toc <- function()
{
type <- get(".type", envir=baseenv())
toc <- proc.time()[type]
tic <- get(".tic", envir=baseenv())
print(toc - tic)
invisible(toc)
}
Использование, например, tic(); invisible(qr(matrix(runif(1e6), nrow=1e3))); toc()
Ответ 2
В CRAN имеется пакет эмуляции MATLAB matlab. Он имеет реализации tic
и toc
(но они очень похожи на функции в ответе Ричи Коттона, вместо "user.self" в proc.time()
используется "истек" )
> tic
function (gcFirst = FALSE)
{
if (gcFirst == TRUE) {
gc(verbose = FALSE)
}
assign("savedTime", proc.time()[3], envir = .MatlabNamespaceEnv)
invisible()
}
<environment: namespace:matlab>
> toc
function (echo = TRUE)
{
prevTime <- get("savedTime", envir = .MatlabNamespaceEnv)
diffTimeSecs <- proc.time()[3] - prevTime
if (echo) {
cat(sprintf("elapsed time is %f seconds", diffTimeSecs),
"\n")
return(invisible())
}
else {
return(diffTimeSecs)
}
}
<environment: namespace:matlab>
Ответ 3
Прямых эквивалентов tic и toc не существует.
См. help(system.time)
, а также руководство R Extensions о профилировании. Обсуждения профилирующих и профилирующих инструментов также находятся в слайдах "Intro to HPC with R", на которые ссылаются высокопроизводительные вычисления с задачами R
Ответ 4
Очень простая эквивалентность с tic и toc, которую вы могли бы иметь:
tic=proc.time()[3]
...code...
toc=proc.time()[3] - tic
Где [3], потому что нас интересует третий элемент в векторе, возвращаемом proc.time(), истекшее время.
Ответ 5
Существует относительно новый пакет tictoc, который реплицирует функции точно так же, как вы использовали бы их в Matlab.
http://cran.r-project.org/web/packages/tictoc/index.html
## Basic use case
tic()
print("Do something...")
Sys.sleep(1)
toc()
# 1.034 sec elapsed
Ответ 6
Подход к закрытию
Очень простой и простой способ сделать это - использовать закрытие (что означает наличие функции внутри функции):
tic <- function () {
now <- proc.time()
function () {
proc.time() - now
}
}
Вы запускаете таймер следующим образом:
toc <- tic()
И затем вы получите время назад следующим образом:
toc()
Какой выдает именованный вектор, который печатается следующим образом:
user system elapsed
0.008 0.004 2.055
Даже с простотой этой версии вы также получаете всю функциональность версий Matlab и Richie Cotton, а также добавленную возможность запуска нескольких таймеров:
toc1 <- tic()
toc2 <- tic()
Ответ 7
На дату 2015-03-25,
и, возможно, раньше,
pracma
пакет содержит функции tic()
и toc()
.
Пример:
> library(pracma)
> tic()
> for(i in 1:10000) mad(runif(10000)) # kill time
> toc()
elapsed time is 18.610000 seconds
Ответ 8
Нет, но вот однострочное решение.
time.it<-function(f) { a<-proc.time(); out<-f(); print(proc.time()-a); out }
И пример использования:
result<-time.it(function(){ A<-matrix(runif(5000^2),nrow=5000); b<-runif(5000); solve(A,b) } )
user system elapsed
12.788 12.268 8.623
В противном случае microbenchmark является моим любимым в плане пакетов.
Ответ 9
Просто для полноты: вы действительно можете "имитировать" tic и toc в R, чтобы вы могли писать
tic
## do something
toc
без круглых скобок. Трюк состоит в том, чтобы злоупотреблять print
функция, как показано в Fun: tic и toc в R:
tic <- 1
class(tic) <- "tic"
toc <- 1
class(toc) <- "toc"
print.tic <- function(x, ...) {
if (!exists("proc.time"))
stop("cannot measure time")
gc(FALSE)
assign(".temp.tictime", proc.time(), envir = .GlobalEnv)
}
print.toc <- function(x,...) {
if (!exists(".temp.tictime", envir = .GlobalEnv))
stop("did you tic?")
time <- get(".temp.tictime", envir = .GlobalEnv)
rm(".temp.tictime", envir = .GlobalEnv)
print(res <- structure(proc.time() - time,
class = "proc_time"), ...)
invisible(res)
}
Итак, набрав
tic
Sys.sleep(2)
toc
должно получиться примерно так:
user system elapsed
0.000 0.000 2.002
Как я уже сказал, это трюк; system.time
, Rprof
и
пакеты, такие как rbenchmark
, являются способом измерения
время вычисления в R.
Ответ 10
install.packages("tictoc")
library(tictoc)
# Timing nested code.
# The string provided in the call to tic() becomes a prefix to the output of toc()
tic("outer")
Sys.sleep(1)
tic("middle")
Sys.sleep(2)
tic("inner")
Sys.sleep(3)
toc() # inner
# inner: 3.004 sec elapsed
toc() # middle
# middle: 5.008 sec elapsed
toc() # outer
# outer: 6.016 sec elapsed
Пакет tictoc реализует функциональность, описанную в предыдущих ответах - спасибо за вдохновение! Пакет также добавляет вложенное время, собирая тайминги в пользовательских переменных, пользовательских сообщениях и обратных вызовах.