R быстрее, когда вы используете его внутренний оптимизированный код для выполнения циклов.Мое понимание причин этого плохое (в ветке комментария выше есть объяснения от более знающих людей), но я считаю, что некоторые из них связаны с предварительным распределением памяти, а некоторые - с тем, как она превращает проблему в болееэффективные куски.
Ваш код "вне цикла" можно было бы сделать еще примерно в 20 раз быстрее (в моей системе он пошел с 7,17 до 0,43 с), сначала создав все ваши случайные числа, а затем решив всю таблицусразу, вместо того, чтобы переключаться между этими двумя задачами в цикле.И это использует dplyr
;Я предполагаю, что решение data.table
может быть еще в 5-10 раз быстрее, особенно с учетом большого количества групп.
library(dplyr)
set.seed(123456789)
K <- 100000
n <- 30
a_df <- data.frame(trial = rep(1:K, each = 30),
val = rnorm(K*n))
results <- a_df %>%
group_by(trial) %>%
summarize(vara = var(val),
sda = sd(val)) %>%
mutate(mvara = cumsum(vara) / trial,
msd = cumsum(sda) / trial)