为什么 rollapply 在 fill=NA 和 function return 多个值时慢得多?
Why rollapply is much slower with fill=NA and function return multiple values?
如果函数 return 有 2 个或更多值,并且使用 fill = NA
、rollapply
会变得更慢。
有什么办法可以避免吗?
f1= function(v)c(mean(v)+ median(v)) #return vector of length 1
f2= function(v)c(mean(v), median(v)) #return vector of length 2
v = rnorm(1000)
microbenchmark(rollapplyr(v, 20, f1), rollapplyr(v,20, f1, fill=NA) )
# expr min lq mean median uq max neval
# rollapplyr(v, 20, f1) 50.84485 53.68726 57.21892 54.63793 57.78519 75.88305 100
# rollapplyr(v, 20, f1, fill = NA) 52.11355 54.69866 59.73473 56.20600 63.10546 99.96493 100
microbenchmark(rollapplyr(v, 20, f2), rollapplyr(v,20, f2, fill=NA) )
# expr min lq mean median uq max neval
# rollapplyr(v, 20, f2) 51.77687 52.29403 56.80307 53.44605 56.65524 105.6713 100
# rollapplyr(v, 20, f2, fill = NA) 69.93853 71.08953 76.48056 72.21896 80.58282 151.4455 100
原因在于对不同类型数据使用 fill.na
的速度,正如 rollapply()
函数内部发生的那样。你的 f1
returns 是一个向量,而 f2
returns 是一个两列的矩阵(好吧,两者实际上都是 zoo
对象,但你明白我的意思) .
插入NA的速度下降与仅仅增加一倍的元素数量不成正比,如下所示:
library(zoo)
library(microbenchmark)
v <- zoo(rnorm(1000))
m <- zoo(matrix(rnorm(2000), ncol=2))
ix <- seq(1000)>50
microbenchmark(na.fill(v, NA, ix), na.fill(m, NA, ix))
# Unit: microseconds
# expr min lq mean median uq max neval
# na.fill(v, NA, ix) 402.861 511.912 679.1114 659.597 754.8385 4716.46 100
# na.fill(m, NA, ix) 9746.643 10091.038 14281.5598 14057.304 17589.9670 22249.96 100
如果函数 return 有 2 个或更多值,并且使用 fill = NA
、rollapply
会变得更慢。
有什么办法可以避免吗?
f1= function(v)c(mean(v)+ median(v)) #return vector of length 1
f2= function(v)c(mean(v), median(v)) #return vector of length 2
v = rnorm(1000)
microbenchmark(rollapplyr(v, 20, f1), rollapplyr(v,20, f1, fill=NA) )
# expr min lq mean median uq max neval
# rollapplyr(v, 20, f1) 50.84485 53.68726 57.21892 54.63793 57.78519 75.88305 100
# rollapplyr(v, 20, f1, fill = NA) 52.11355 54.69866 59.73473 56.20600 63.10546 99.96493 100
microbenchmark(rollapplyr(v, 20, f2), rollapplyr(v,20, f2, fill=NA) )
# expr min lq mean median uq max neval
# rollapplyr(v, 20, f2) 51.77687 52.29403 56.80307 53.44605 56.65524 105.6713 100
# rollapplyr(v, 20, f2, fill = NA) 69.93853 71.08953 76.48056 72.21896 80.58282 151.4455 100
原因在于对不同类型数据使用 fill.na
的速度,正如 rollapply()
函数内部发生的那样。你的 f1
returns 是一个向量,而 f2
returns 是一个两列的矩阵(好吧,两者实际上都是 zoo
对象,但你明白我的意思) .
插入NA的速度下降与仅仅增加一倍的元素数量不成正比,如下所示:
library(zoo)
library(microbenchmark)
v <- zoo(rnorm(1000))
m <- zoo(matrix(rnorm(2000), ncol=2))
ix <- seq(1000)>50
microbenchmark(na.fill(v, NA, ix), na.fill(m, NA, ix))
# Unit: microseconds
# expr min lq mean median uq max neval
# na.fill(v, NA, ix) 402.861 511.912 679.1114 659.597 754.8385 4716.46 100
# na.fill(m, NA, ix) 9746.643 10091.038 14281.5598 14057.304 17589.9670 22249.96 100