Почему векторизация быстрее

Я уже некоторое время изучаю R и натолкнулся на множество советов типам программирования, таким как я, для векторизации операций. Будучи программистом, мне интересно, почему / как это быстрее. Пример:

n = 10^7
# populate with random nos
v=runif(n)
system.time({vv<-v*v; m<-mean(vv)}); m
system.time({for(i in 1:length(v)) { vv[i]<-v[i]*v[i] }; m<-mean(vv)}); m

Это дало

   user  system elapsed 
   0.04    0.01    0.07 
[1] 0.3332091

   user  system elapsed 
  36.68    0.02   36.69 
[1] 0.3332091

Наиболее очевидная вещь, которую следует учитывать, - это то, что мы используем нативный код, то есть машинный код, скомпилированный из C или C ++, а не интерпретируемый код, о чем свидетельствует огромная разница во времени пользователя между двумя примерами (примерно на 3 порядка). Но что-нибудь еще происходит? Например, R делает:

Хитрые нативные структуры данных, например умные способы хранения разреженных векторов или матриц, чтобы мы умножали только тогда, когда нам нужно?

Ленивая оценка, например при умножении матрицы не оценивайте ячейки до тех пор, пока вам это не понадобится.

Параллельная обработка.

Что-то другое.

Чтобы проверить, возможна ли некоторая оптимизация разреженных векторов, я попытался создать точечные произведения с содержанием разностных векторов.

# populate with random nos
v<-runif(n)
system.time({m<-v%*%v/n}); m
# populate with runs of 1 followed by 99 0s
v <-rep(rep(c(1,rep(0,99)),n/100))
system.time({m<-v%*%v/n}); m
# populate with 0s
v <-rep(0,n)
system.time({m<-v%*%v/n}); m

Однако существенной разницы во времени не наблюдалось (прошло около 0,09)

(Аналогичный вопрос для Matlab:Почему векторизованный код работает быстрее, чем циклы for в MATLAB?)

Ответы на вопрос(3)

Ваш ответ на вопрос