2016-11-10 74 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