#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