2016-11-10 72 views
0

当我在下面的代码中使用进度条时,计算时间有很大的不同。任何建议,以改善它将不胜感激。r和系统时间的进度条

mysum = function(n){ 
    s=0 
    total=length(a) 
    for (i in 1: n){ 
    s = s+i 
    pb = txtProgressBar(min = 0, max=n, initial = 0, style = 3) 
    setTxtProgressBar(pb,i) 
} 
close(pb) 
s 
} 

system.time(mysum(10000))   


user system elapsed 
1.828 0.158 1.871 


mysum1 = function(n){ 
s=0 
total=length(a) 
for (i in 1: n){ 
s = s+i 
} 
s 
} 

system.time(mysum1(10000))  


user system elapsed 
0.003 0.000 0.003 

我正在使用R 3.2.4到R Studio。

回答

1

进度条会产生开销。您应该问的问题是由进度条创建的开销值得花费额外的时间来向您显示计算中的位置。在我的大部分计算中,这是值得的,因为它们可能需要几分钟的时间,进度条只会增加额外时间的一小部分,但是会提供很多信息。

此外还有更多的软件包使用进度条,其功能比txtProgressBar函数要快一些。

下面是一些比较。第一个功能没有进度条。你可以看到来自包进度的进度条比来自R的进度条快一些。周围还有一些进度条,比如pbapply。在Github的进度页面上,您可以找到一个rcpp示例。

mysum0 <- function(n){ 
    s <- 0 
    for (i in 1: n){ 
    s = s + i 
    } 
    s 
} 

mysum1 = function(n){ 
    s=0 
    for (i in 1: n){ 
    s = s + i 
    pb = txtProgressBar(min = 0, max = n, initial = 0, style = 3) 
    setTxtProgressBar(pb, i) 
    } 
    close(pb) 
    s 
} 

library(progress) 
mysum2 <- function(n){ 
    pb <- progress_bar$new(total = n, clear = FALSE) 
    s <- 0 
    pb$tick(0) 
    for (i in 1: n){ 
    s <- s + i 
    pb$tick() 
    } 
    s 
} 

mb <- microbenchmark::microbenchmark(mysum0(1000), 
           mysum1(1000), 
           mysum2(1000), 
           times = 100L) 

pirnt(mb) 
print(mb, unit = "eps") 
print(mb, unit = "relative") 

> mb 
Unit: microseconds 
     expr  min   lq  mean  median   uq  max neval 
mysum0(1000) 272.091 288.4745 319.0893 297.252 307.492 2108.846 100 
mysum1(1000) 121191.322 124239.9035 125913.9429 125777.652 127380.937 133798.170 100 
mysum2(1000) 76761.331 80152.6575 82717.5762 81554.361 83240.735 132357.554 100 
> print(mb, unit = "eps") # how iterations test per second 
Unit: evaluations per second 
     expr  min   lq  mean  median   uq   max neval 
mysum0(1000) 474.192995 3252.120061 3307.531315 3364.14894 3466.514469 3675.241004 100 
mysum1(1000) 7.473944 7.850468 7.945014 7.95054 8.048948 8.251416 100 
mysum2(1000) 7.555292 12.013414 12.151598 12.26176 12.476193 13.027393 100 
> print(mb, unit = "relative") # relative to the first function tested 
Unit: relative 
     expr  min  lq  mean median  uq  max neval 
mysum0(1000) 1.0000 1.0000 1.0000 1.0000 1.0000 1.00000 100 
mysum1(1000) 445.4073 430.6790 394.6041 423.1348 414.2577 63.44615 100 
mysum2(1000) 282.1164 277.8501 259.2302 274.3610 270.7086 62.76302 100 
+0

谢谢。这非常有帮助。 +1 – overwhelmed