当我在以下代码中使用进度条时,计算时间差异很大。任何改进它的建议将不胜感激。
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。
答案 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