De: Luis Carvalho
<lexcarvalho@gmail.com>
Para: Jose F. de Carvalho <carvalho@statistika.com.br>; Gustavo H. Esteves <gesteves@uepb.edu.br>
Cc: abe-l@ime.usp.br
Enviadas: Terça-feira, 11 de Setembro de 2012 21:57
Assunto: Re: [ABE-L]: corrigindo
Jose F. de Carvalho wrote:
> Rodei o seguinte programa no SAS, em minha maquina mais fraca (ASUS EEE PC
> Seashell, com 1Gb de memoria, usando SAS 9.3); como se ve, sao 50 milhoes
> de gerac,oes de uma Bernouilli, com p=0.5). O tempo de CPU foi 30.43
> segundos (e o de "sala" 1:24.28 [um minuto e vinte e quatro segundos). Nao
> estou comparando softwares, pois nao sei se as maquinas sao
comparaveis.
> Tao diferentes assim nao sao. Achei 18 minutos um tempo absurdamente alto
> para um job tao pequeno. Qual era o ponto de seu e-mail?
> data t;
> p=0.5;
> do i=1 to 5E+07;
> x = RAND('BERNOULLI',p);
> output;
> end;
> run;
Seu programa nao acumula o numero de sucessos, mas o ponto ainda e' valido:
nao deve durar muito para se obter a soma de 50 milhoes de Bernoulli(0.5). Mas
SAS e' uma linguagem compilada, e provavelmente com compilador JIT ("just in
time"), logo esse laco pode ser praticamente eliminado ou vetorizado por um
bom compilador (ver abaixo.)
Gustavo H. Esteves wrote:
> Prezado Jose de Carvalho,
> Nao vi a implementac,ao original do
problema da simulac,ao dos
> lanc,amentos da moeda em R e tambem nao sei exatamente como o SAS e
> implementado para poder comparar os resultados.
> Porem, o R e um software de linguagem interpretada (sendo que suas
> func,oes "core", em geral, sao implementadas em alguma linguagem
> compilada, tais como C, C++ ou Fortran) e por isso ele costuma ficar
> realmente muito lento quando se usa muitos "loops" (principalmente
> aninhados).
> Recentemente tive um problema com a implementac,ao de uma func,ao de
> correlac,ao que ficou 64 vezes mais rapida (em um simulac,ao de 1000
> observac,oes de um normal bivariada) quando implementada em C, se
> comparada com sua implementac,ao original em R.
Alem de ser uma linguagem interpretada, R e' funcional
e logo pode gastar
muita memoria ja' que variaveis sao passadas por valor em vez de por
referencia. Mas mesmo assim deve ser possivel "vetorizar" o codigo e evitar o
laco, com algo como:
x = mean(rbinom(5e7, 1, .5))
O problema pode ser o uso de memoria -- dependendo de quanta memoria voce
tenha disponivel -- ja que um vetor de 5e7 posicoes e' gerado... Talvez melhor
ainda e' usar, equivalentemente, e sem vetorizacao,
x = rbinom(1, 5e7, .5) / 5e7
mas ai' eu estou quase "evitando" o problema... :)
Outro fator importante ao se comparar esses tempos de execucao para varias
amostragens e' o gerador de numeros (pseudo-)aleatorios; o RNG padrao do R e'
o Mersenne-Twister, que e' bem rapido e tem um periodo bastante longo.
Abracos,
Luis
--
Mathematicians practice absolute freedom.
-- Henry Adams
--
Luis
Carvalho
Assistant Professor
Dept. of Mathematics and Statistics
Boston University