Является ли Sys.time() временем, необходимым отдельному компьютеру для выполнения команд?

#r #loops #for-loop #time

#r #циклы #для цикла #время

Вопрос:

Я использую язык программирования R. Я изучаю различные типы «времени» в вычислениях. По-видимому, существует два типа общего времени: время, соответствующее общей математической сложности выполняемых вами процедур, и время, соответствующее тому, сколько времени требуется вашему отдельному компьютеру для выполнения процедур.

Я наткнулся на команду Sys.time() в R здесь: https://www.r-bloggers.com/2017/05/5-ways-to-measure-running-time-of-r-code /

Измеряет ли Sys.time() время, необходимое вашему отдельному компьютеру для выполнения команд? Например, я написал приведенный ниже код, используя Sys.time(), чтобы измерить время, необходимое моему персональному компьютеру для выполнения следующей процедуры в R для разного количества наблюдений.

  library(Rtsne)
    library(cluster)
    library(ggplot2)
    library(dplyr)
    library(dbscan)
    library(plotly)


#generate data

var_1 <- rnorm(1000,1,4)
var_2<-rnorm(1000,10,5)
var_3 <- sample( LETTERS[1:4], 1000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05) )
response_variable <- sample( LETTERS[1:2], 100, replace=TRUE, prob=c(0.4, 0.6) )


#put them into a data frame called "f"
f <- data.frame(var_1, var_2, var_3, response_variable)

#declare var_3 and response_variable as factors
f$response_variable = as.factor(f$response_variable)
f$var_3 = as.factor(f$var_3)

#create id
f$ID <- seq_along(f[,1])


mseDF <- NULL

for (size in c(100,500,1000)) {
   
    start_time <- Sys.time()
   
   
    #gower distance
   
    gower_dist <- daisy(f[1:size, 1:4],
                        metric = "gower")
   
    lof <- lof(gower_dist, k=3)
   
    tsne_obj <- Rtsne(gower_dist,  is_distance = TRUE)
   
    tsne_data <- tsne_obj$Y %>%
        data.frame() %>%
        setNames(c("X", "Y")) %>%
        mutate(
            name = f[1:size,]$ID,
            lof=lof,
            var1=f[1:size,]$var_1,
            var2=f[1:size,]$var_2,
            var3=f[1:size,]$var_3
        )
   
    p1 <- ggplot(aes(x = X, y = Y, size=lof, key=name, var1=var1,
                     var2=var2, var3=var3), data = tsne_data)  
        geom_point(shape=1, col="red") 
        theme_minimal()
   
   
    ggplotly(p1, tooltip = c("lof", "name", "var1", "var2", "var3"))
    end_time <- Sys.time()
   
   (final = end_time - start_time)
   print (final)
mseDF <- rbind(mseDF, data.frame(size, final))

}
 

Это правильно?

Дополнительно: визуализируйте время выполнения:

 plot(mseDF)
 lines(mseDF)
 

Спасибо

Ответ №1:

Другой способ — использовать proc.time; например

 > start_time <- proc.time()
> # some computation
> for (i in 1:10000000) i ^ 3
> proc.time() - start_time
   user  system elapsed 
   0.70    0.02    0.72 
 

Ответ №2:

Измеряет ли Sys.time() время, необходимое вашему отдельному компьютеру для выполнения команд?

Нет. Sys.time() возвращает текущее время. Аналогично Sys.Date() возвращает текущую дату. Вы могли бы создать функцию истекшего времени, в которой есть код, путем вычитания двух вызовов Sys.time . Но ваш код подразумевает, что вы уже знаете, как это сделать, поэтому, возможно, английский не является вашим родным языком, и этот вопрос был простой ошибкой в выражении. Так что, возможно, «да», поскольку, похоже, вы получите время, затраченное на появление результата.

Возможно, вы захотите взглянуть на ?system.time

 system.time({for(i in 1:10e6){x <- Sys.time()}})
#   user  system elapsed 
# 13.274   0.000  13.273 
 

Существует также несколько пакетов тестов (как показано в приведенной выше цитате из блога.). Пример: pkg:microbenchmark