Ниже у меня есть три функции, которые выполняют одну и ту же операцию - дублируют данный data.frame и rbind
его себе (т.е. плохая практика выращивания объекта).
Первая функция, f1
, копирует входной объект в новый объект, x
, затем увеличивает этот объект и, наконец, заменяет входной объект.
Вторая функция, f2
, копирует входной объект в новый объект, x
, а затем увеличивает входной объект.
Третья функция, f3
, только увеличивает входной объект.
Я бы ожидал, что f1
будет самым медленным, учитывая, что по существу требуется, чтобы распределение памяти было изменено как для df
, так и для x
. Наоборот, все 3 функции кажутся примерно эквивалентными по времени вычислений. Как я могу понять это поведение? Мой пример некорректен?
## Functions
# copy df, grow copy, replace df with copy
f1 <- function(df){
x <- df
x <- rbind(x, x)
df <- x
return(df)
}
# copy df, grow df
f2 <- function(df){
x <- df
df <- rbind(df, x)
return(df)
}
# grow df
f3 <- function(df){
df <- rbind(df, df)
return(df)
}
## Benchmark
df <- rbind(iris)
res <- microbenchmark(f1(df), f2(df), f3(df), times=5000L)
## Print results:
print(res)
# Unit: microseconds
# expr min lq mean median uq max neval
# f1(df) 255.66 263.591 292.6851 270.123 292.516 2693.291 5000
# f2(df) 255.66 263.591 302.5159 270.590 292.516 15460.876 5000
# f3(df) 255.66 263.591 299.6157 270.122 292.516 3613.758 5000
## Plot results:
boxplot(res)