2017-01-19 7 views
1

함수가 2 개 이상의 값을 반환하고 fill = NA을 사용하면 rollapply이 훨씬 느려집니다. 피할 수있는 방법이 있습니까? rollapply() 함수 내부적으로 발생왜 fillapply가 fill = NA로 훨씬 느리고 함수가 여러 값을 반환합니까?

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 
+2

1 - 당신은 당신이 사용하고있는 패키지를 지정하지 않은 :이 같이

개구를 삽입하기위한 속도의 감소는, 요소 수의 단순한 두 배에 비례하지 않습니다. 2 - 당신은 측정 단위조차 보이지 않았습니다. 추가 작업을 수행 할 때 약간의 벌칙이있는 것 같습니다. 3- 속도 체크 아웃을 개선하고 싶다면 https://cran.r-project.org/web/packages/RcppRoll/RcppRoll.pdf –

+0

여분의 시간은 위의 'v'의 길이와 선형입니다. – user3226167

답변

3

이유는, 상이한 타입의 데이터에 fill.na 사용의 속도에서 찾을 수있다. f1은 단일 벡터를 반환하는 반면, f2은 두 개의 열이있는 행렬을 반환합니다 (둘 다 실제로는 zoo 개체지만 내 표류를 잡습니다).

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