Por que a vectorização é mais rápida?

Eu tenho aprendido R por um tempo agora, e tenho encontrado muitos conselhos para tipos de programação como eu para vetorizar operações. Sendo um programador, estou interessado em saber porquê / como é mais rápido. Um exemplo:

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

Isso deu

   user  system elapsed 
   0.04    0.01    0.07 
[1] 0.3332091

   user  system elapsed 
  36.68    0.02   36.69 
[1] 0.3332091

A coisa mais óbvia a considerar é que estamos executando código nativo, ou seja, código de máquina compilado de C ou C ++, em vez de código interpretado, como mostrado pela enorme diferença no tempo do usuário entre os dois exemplos (cerca de 3 ordens de magnitude). Mas há mais alguma coisa acontecendo? Por exemplo, o R faz:

Estruturas de dados nativas inteligentes, por ex. maneiras inteligentes de armazenar vetores ou matrizes esparsas, de modo que só fazemos multiplicações quando precisamos?

Avaliação preguiçosa, por ex. em uma matriz multiplique, não avalie as células até que e quando você precisar.

Processamento paralelo.

Algo mais.

Para testar se pode haver alguma otimização vetorial esparsa, tentei criar produtos de ponto com conteúdo vetorial diferente

# 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

No entanto, não houve diferença significativa no tempo (cerca de 0,09)

(Questão semelhante para Matlab:Por que o código vetorizado é executado mais rápido que os loops no MATLAB?)

questionAnswers(3)

yourAnswerToTheQuestion