2016-11-10 14 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スタジオからRスタジオを使用しています。

答えて

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

関連する問題