Medir el tiempo de un procedimiento
David J. Santana
19 de febrero de 2017
Cuando tenemos varias formas de programar una tarea con R, podemos tener la duda de cuál es la más rápida si todas tienen el mismo resultado numérico.
El siguiente código muestra tres formas distintas de calcular la potencia de una matriz, con una función del paquete expm, usando ciclos con for y usando ciclos con repeat. Se ejemplifica el uso de las funciones %^% (matpow del paquete expm) y lapply. La primera para calcular la potencia de una matriz y la segunda para aplicar una función a un vector.
Solo se presentan los resultados de los tiempos. En este ejemplo, el uso de for es mejor que el uso de un repeat. La mejor opción de las tres es usar %^% del paquete expm.
#######################################
#######################################
# USANDO matpow
# library(expm)
#Prueba de velocidad
A <- matrix(c(1,2,3,4,5,6,7,8,9),3,3)
t0 <- proc.time()
for(i in 1:500000){
x <- A%^%100
}
tiempo <- proc.time()-t0
t1usando_matpow <- tiempo
x
## [,1] [,2] [,3]
## [1,] 5.988768e+119 1.356220e+120 2.113562e+120
## [2,] 7.358480e+119 1.666405e+120 2.596963e+120
## [3,] 8.728192e+119 1.976591e+120 3.080363e+120
#######################################
#######################################
# USANDO for
# N = 2, 3, ...
PotMat <- function(A,N){
AalaN <- A
i <- 1
repeat{
AalaN <- AalaN%*%A
i <- i + 1
if(i == N){break}
}
AalaN
}
#Prueba de velocidad
A <- matrix(c(1,2,3,4,5,6,7,8,9),3,3)
t0 <- proc.time()
#######################
for(i in 1:500000){
x <- PotMat(A,100)
}
#######################
tiempo <- proc.time()-t0
t2usando_repeat <- tiempo
x
## [,1] [,2] [,3]
## [1,] 5.988768e+119 1.356220e+120 2.113562e+120
## [2,] 7.358480e+119 1.666405e+120 2.596963e+120
## [3,] 8.728192e+119 1.976591e+120 3.080363e+120
#######################################
#######################################
# USANDO repeat
# N = 2, 3, ...
PotMat2 <- function(A,N){
AalaN <- A
for(i in 2:N){
AalaN <- AalaN%*%A
}
AalaN
}
#Prueba de velocidad
A <- matrix(c(1,2,3,4,5,6,7,8,9),3,3)
t0 <- proc.time()
#######################
for(i in 1:500000){
x <- PotMat2(A,100)
}
#######################
tiempo <- proc.time()-t0
t3usando_for <- tiempo
x
## [,1] [,2] [,3]
## [1,] 5.988768e+119 1.356220e+120 2.113562e+120
## [2,] 7.358480e+119 1.666405e+120 2.596963e+120
## [3,] 8.728192e+119 1.976591e+120 3.080363e+120
t1usando_matpow
## user system elapsed
## 1.25 0.00 1.25
t2usando_repeat
## user system elapsed
## 59.47 0.01 59.53
t3usando_for
## user system elapsed
## 32.48 0.00 32.49