Ответ 1
Я думаю, мне нужно сделать это полным ответом, потому что я нахожу комментарии сложнее, чтобы отслеживать, и я уже потерял один комментарий по этому поводу... Есть пример nullglob, который демонстрирует различия между и применяет семейные функции намного лучше, чем другие примеры. Когда вы делаете такую функцию такой, что она очень медленная, тогда, когда потребляется вся скорость, и вы не найдете различий между вариациями цикла. Но когда вы делаете функцию тривиальной, вы можете видеть, насколько петля влияет на вещи.
Я также хотел бы добавить, что некоторые члены семейства приложений, не изученные в других примерах, обладают интересными характеристиками производительности. Сначала я покажу репликации относительных результатов nullglob на моей машине.
n <- 1e6
system.time(for(i in 1:n) sinI[i] <- sin(i))
user system elapsed
5.721 0.028 5.712
lapply runs much faster for the same result
system.time(sinI <- lapply(1:n,sin))
user system elapsed
1.353 0.012 1.361
Он также нашел гораздо более медленным. Вот некоторые другие, которые не были протестированы.
Обычные старые применяются к матричной версии данных...
mat <- matrix(1:n,ncol =1),1,sin)
system.time(sinI <- apply(mat,1,sin))
user system elapsed
8.478 0.116 8.531
Итак, сама команда apply() существенно медленнее, чем цикл for. (для цикла не замедление заметно, если я использую sin (mat [i, 1]).
Другой, который, похоже, не тестировался в других сообщениях, не подходит.
system.time(sinI <- tapply(1:n, 1:n, sin))
user system elapsed
12.908 0.266 13.589
Конечно, никто никогда не будет использовать этот способ, и в большинстве случаев его полезность намного превосходит любую проблему со скоростью.