Quindi diciamo che voglio prendere il vettore X = 2 * 1: N e aumentare e all'esponente di ogni elemento. (Sì, riconosco che il modo migliore per farlo è semplicemente con vectorization exp (X), ma il punto di questo è confrontare per loop con sapply). Bene, ho provato testando in modo incrementale tre metodi (uno con loop for, due con sapply applicato in un modo diverso) con diverse dimensioni del campione e misurando il tempo corrispondente. Quindi tracciamo la dimensione del campione N rispetto al tempo t per ciascun metodo.Perché la scala è più lenta di quella del ciclo con la dimensione del campione?
Ogni metodo è indicato da "#####".
k <- 20
t1 <- rep(0,k)
t2 <- rep(0,k)
t3 <- rep(0,k)
L <- round(10^seq(4,7,length=k))
for (i in 1:k) {
X <- 2*1:L[i]
Y1 <- rep(0,L[i])
t <- system.time(for (j in 1:L[i]) Y1[j] <- exp(X[j]))[3] #####
t1[i] <- t
}
for (i in 1:k) {
X <- 2*1:L[i]
t <- system.time(Y2 <- sapply(1:L[i], function(q) exp(X[q])))[3] #####
t2[i] <- t
}
for (i in 1:k) {
X <- 2*1:L[i]
t <- system.time(Y3 <- sapply(X, function(x) exp(x)))[3] #####
t3[i] <- t
}
plot(L, t3, type='l', col='green')
lines(L, t2,col='red')
lines(L, t1,col='blue')
plot(log(L), log(t1), type='l', col='blue')
lines(log(L), log(t2),col='red')
lines(log(L), log(t3), col='green')
Otteniamo i seguenti risultati. Terreno di N vs t:
Aree log (N) vs log (t)
La trama blu è il ciclo for metodo, e le trame rosse e verdi sono i metodi sapply. Nel plot regolare, è possibile notare che, man mano che la dimensione del campione aumenta, il metodo for loop viene fortemente favorito rispetto ai metodi sapply, il che non è affatto quello che mi sarei aspettato. Se guardi la trama del log-log (per distinguere più facilmente i risultati N più piccoli) vediamo il risultato atteso che Sapply è più efficiente di loop per small N.
Qualcuno sa perché sapply scala più lentamente che per loop con dimensioni del campione? Grazie.
@Bridgeburners 'sapply (...) == simplify2array (lapply (...))'. Che dire di 'unlist (lapply (...))'? Solo per completezza - Sono curioso – gagolews
@Bridgeburners: BTW, invece di 'plot (log (L), log (t1), type = 'l', col = 'blue')' prova 'trama (L, t1, log = "xy") ' – gagolews