[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de 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