Думаю, мне нужно дать полный ответ, потому что мне труднее отслеживать комментарии, и я уже потерял один комментарий по этому поводу ... Вот пример от nullglob, который демонстрирует различия между функциями for и применяет семейные функции намного лучше, чем другие примеры. Если сделать функцию очень медленной, тогда будет потрачена вся скорость, и вы не найдете различий между вариациями цикла. Но когда вы сделаете функцию тривиальной, вы увидите, насколько сильно на вещи влияет цикл.
Я также хотел бы добавить, что некоторые члены семейства приложений, не исследованные в других примерах, обладают интересными характеристиками производительности. Сначала я покажу репликации относительных результатов 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
Он также обнаружил, что sapply намного медленнее. Вот некоторые другие, которые не тестировались.
Обычное старое применимо к матричной версии данных ...
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 таким образом, и его полезность намного превосходит любую подобную проблему скорости в большинстве случаев.
person
John
schedule
26.07.2010