R:对于缓慢的双重应用我能做些什么?
R: What can I do about a slow double sapply?
我有一个计算可以执行此操作的一个版本:
n <- 5
l <- 3
m <- seq(0,1,length.out = n)
r <- seq(3,4,length.out = n)
y <- 1:n
pp <- sapply(0:l, function(h) cumsum(y[(h+1):n]*y[1:(n-h)]))
rec.acf <- sapply(0:l, function(h) pp[[h+1]] + sapply((h+1):n, function(j) m[j] + r[j-h]) )
获得
> rec.acf
[[1]]
[1] 4.0 8.5 18.0 34.5 60.0
[[2]]
[1] 5.25 11.75 24.25 44.75
[[3]]
[1] 6.5 15.0 30.5
[[4]]
[1] 7.75 18.25
在实践中,当然,n
和 l
要大得多(而且实际函数 computing autocovariances 在样本大小增加的情况下会更复杂)。
当 l
相对较小时,正如我所希望的那样,计算比我已经制定的其他实现要快得多,这些实现没有考虑到我可以通过 [=15 回收许多相同的计算=].
然而,当 l
相对于 n
较大时,情况相反,可能是因为外部 sapply
然后发出许多内部循环。我的方法有什么明显低效的地方吗?
我修改了 mapply
,但没有成功。
不需要内部循环:
mm = lapply(0:l, function(h) tail(m, length(m) - h) + head(r, length(r) - h))
mapply("+", pp, mm)
#[[1]]
#[1] 4.0 8.5 18.0 34.5 60.0
#
#[[2]]
#[1] 5.25 11.75 24.25 44.75
#
#[[3]]
#[1] 6.5 15.0 30.5
#
#[[4]]
#[1] 7.75 18.25
我有一个计算可以执行此操作的一个版本:
n <- 5
l <- 3
m <- seq(0,1,length.out = n)
r <- seq(3,4,length.out = n)
y <- 1:n
pp <- sapply(0:l, function(h) cumsum(y[(h+1):n]*y[1:(n-h)]))
rec.acf <- sapply(0:l, function(h) pp[[h+1]] + sapply((h+1):n, function(j) m[j] + r[j-h]) )
获得
> rec.acf
[[1]]
[1] 4.0 8.5 18.0 34.5 60.0
[[2]]
[1] 5.25 11.75 24.25 44.75
[[3]]
[1] 6.5 15.0 30.5
[[4]]
[1] 7.75 18.25
在实践中,当然,n
和 l
要大得多(而且实际函数 computing autocovariances 在样本大小增加的情况下会更复杂)。
当 l
相对较小时,正如我所希望的那样,计算比我已经制定的其他实现要快得多,这些实现没有考虑到我可以通过 [=15 回收许多相同的计算=].
然而,当 l
相对于 n
较大时,情况相反,可能是因为外部 sapply
然后发出许多内部循环。我的方法有什么明显低效的地方吗?
我修改了 mapply
,但没有成功。
不需要内部循环:
mm = lapply(0:l, function(h) tail(m, length(m) - h) + head(r, length(r) - h))
mapply("+", pp, mm)
#[[1]]
#[1] 4.0 8.5 18.0 34.5 60.0
#
#[[2]]
#[1] 5.25 11.75 24.25 44.75
#
#[[3]]
#[1] 6.5 15.0 30.5
#
#[[4]]
#[1] 7.75 18.25