Que bonita demostração Benilton, vou fazer a liçãod e casa aqui, valeu!<br><br>att,<br>FH<br><br><div class="gmail_quote">2011/6/14 Benilton Carvalho <span dir="ltr"><<a href="mailto:beniltoncarvalho@gmail.com">beniltoncarvalho@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Atualmente, a ideia de *apply() ser mais rapido que for() nao eh<br>
exatamente verdadeira.<br>
<br>
A diferenca essencial (as far as users care) entre ambas eh que a<br>
familia *apply cria um objeto de resposta para cada elemento de<br>
entrada, ao passo que usuarios do for() fazem alocacao da resposta a<br>
objetos pre-existentes (o que dispara uma copia e, consequentemente,<br>
faz com que a execucao seja mais lenta).<br>
<br>
Veja o exemplo abaixo (mude as dimensoes caso vc nao tenha RAM suficiente):<br>
<br>
nc <- 1e6<br>
nr <- 200<br>
<br>
## com sapply<br>
set.seed(1)<br>
t0 <- system.time(res0 <- sapply(1:nr, function(x) rnorm(nc)))<br>
<br>
## com for() usando o q a maioria de usuarios faz...<br>
set.seed(1)<br>
t1 <- system.time({res1 <- NULL; for (i in 1:nr) res1 <- cbind(res1,<br>
rnorm(nc))})<br>
all.equal(res0, res1)  ## deve ser TRUE<br>
rm(res0)<br>
<br>
## com for() mais eficiente<br>
set.seed(1)<br>
t2 <- system.time({res2 <- matrix(NA, nc=nr, nr=nc); for (i in 1:nr)<br>
res2[,i] <- rnorm(nc)})<br>
all.equal(res1, res2) ## deve ser TRUE<br>
rm(res1); gc()<br>
<br>
## com lapply()<br>
set.seed(1)<br>
t3 <- system.time(res3 <- do.call(cbind, lapply(1:nr, function(x) rnorm(nc))))<br>
all.equal(res2, res3) ## deve ser TRUE<br>
rm(res2, res3); gc()<br>
<br>
## visualizando tempos<br>
message(sprintf('sapply...........: %2.4f', t0[3]))<br>
message(sprintf('for() usual......: %2.4f', t1[3]))<br>
message(sprintf('for() pre-aloc..: %2.4f', t2[3]))<br>
message(sprintf('do.call+lapply: %2.4f', t3[3]))<br>
<br>
Os resultados que obtive na minha maquina sao:<br>
<br>
sapply...........: 20.5400<br>
for() usual......: 207.3900<br>
for() pre-aloc..: 21.7730<br>
do.call+lapply: 18.3960<br>
<br>
Take-home messages:<br>
<br>
1) for() mais lento e' fato qdo a programacao e' ineficiente;<br>
2) lapply() e' sempre mais eficiente que sapply()<br>
<br>
Take-home exercise: repita o for() com pre-alocacao usando listas,<br>
combinando o resultado com do.call()... Isso e' tao rapido quanto o<br>
do.call+lapply (na verdade, na minha execucao, ele eh ainda<br>
ligeiramente mais rapido... levando 18.385s)...<br>
<br>
b<br>
<br>
2011/6/14 Junior Beleti <<a href="mailto:beleti.junior@gmail.com">beleti.junior@gmail.com</a>>:<br>
<div><div></div><div class="h5">> Boa noite,<br>
><br>
> gostaria de entender o funcionamento da função apply, mais precisamente<br>
> lapply, para loops.<br>
><br>
> Já conheço a descrição de seu funcionamento:<br>
><br>
> ‘lapply’ returns a list of the same length as ‘X’, each element of which is<br>
> the result of applying ‘FUN’ to the corresponding element of ‘X’.<br>
><br>
><br>
> Mas o que eu gostaria de saber é como ele funciona em sua essência. Por<br>
> exemplo, utilizar um lapply ao invés de um loop "for" é mais rápido.<br>
> Eu gostaria de saber o porque, ou seja, como o lapply é implementado.<br>
><br>
> Não sei se fui claro, mas gostaria de encontrar a implementação da função<br>
> lapply, o que não encontrei no diretório do pacote "base".<br>
><br>
> Se alguém puder ajudar.<br>
><br>
> Também peço desculpas por não ter dado grandes contribuições para a lista,<br>
> mas creio ter mais experiência em programação (lógica) de fato, do que no<br>
> ambiente R.<br>
><br>
> Obrigado.<br>
><br>
> --<br>
> Carlos Roberto Beleti Junior<br>
> Mestrado em Ciência da Computação<br>
> Departamento de Informática<br>
> Universidade Estadual de Maringá<br>
><br>
</div></div><div class="im">> _______________________________________________<br>
> R-br mailing list<br>
> <a href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
> <a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
> Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código<br>
> mínimo reproduzível.<br>
><br>
<br>
<br>
<br>
</div><font color="#888888">--<br>
Successful people ask better questions, and as a result, they get<br>
better answers. (Tony Robbins)<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br>
</div></div></blockquote></div><br>