r和系统时间的进度条

时间:2016-11-10 03:05:50

标签: 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 Studio使用R 3.2.4。

1 个答案:

答案 0 :(得分: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