Я думаю, мне нужно сделать это полным ответом, потому что мне труднее отслеживать комментарии, и я уже потерял один комментарий по этому поводу. Есть пример 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. (цикл for не сильно замедляется, если я использую sin (mat [i, 1]).
Еще один, который, похоже, не тестировался в других постах, это tapply.
system.time(sinI <- tapply(1:n, 1:n, sin))
user system elapsed
12.908 0.266 13.589
Конечно, никто бы никогда не использовал tapply таким образом, и его утилита в большинстве случаев выходит далеко за рамки такой проблемы со скоростью.