Soy nuevo a R (Revolution Analytics R) y he estado traduciendo algunas funciones de Matlab en R.¿Por qué R es lento en esta función de permutación aleatoria?
Pregunta: ¿Por qué es la función GRPdur (n) es tan lenta?
GRPdur = function(n){
#
# Durstenfeld's Permute algorithm, CACM 1964
# generates a random permutation of {1,2,...n}
#
p=1:n # start with identity p
for (k in seq(n,2,-1)){
r = 1+floor(runif(1)*k); # random integer between 1 and k
tmp = p[k];
p[k] = p[r]; # Swap(p(r),p(k)).
p[r] = tmp;
}
return(p)
}
Aquí es lo que me pasa en un Dell Precision 690, 2xQuadcore Xeon 5345 @ 2,33 GHz, Windows 7 de 64 bits:
> system.time(GRPdur(10^6))
user system elapsed
15.30 0.00 15.32
> system.time(sample(10^6))
user system elapsed
0.03 0.00 0.03
Aquí es lo que me pasa en Matlab 2011b
>> tic;p = GRPdur(10^6);disp(toc)
0.1364
tic;p = randperm(10^6);disp(toc)
0.1116
Aquí es lo que me pasa en Matlab 2008a
>> tic;p=GRPdur(10^6);toc
Elapsed time is 0.124169 seconds.
>> tic;p=randperm(10^6);toc
Elapsed time is 0.211372 seconds.
>>
ENLACES: GRPdur es parte de RPGlab, un paquete de funciones de Matlab que escribí que genera y prueba varios generadores de permutación aleatoria. Las notas se pueden ver por separado aquí: Notes on RPGlab.
El programa original Durstenfeld Algol es here
Simplemente curioso: ¿has probado el código for-loop en Matlab? –
Porque cada vez que modifica un objeto en r, se realiza una copia. – hadley
Puedo reducir el tiempo de la versión R en un factor de 10 al vectorizar correctamente la creación de 'r' fuera del ciclo for y luego usar el compilador de bytes de R en él (Matlab hace la compilación JIT de manera predeterminada, ¿verdad?). – joran