0

在使用 for 循环时,我经常遇到这样的建议,即应该预先分配一个对象并“填充”它,而不是让对象在 for 循环中“增长”。这个经验法则是否也适用于 foreach 的使用?

举一个荒谬的简单示例,假设我想在每次蒙特卡洛绘图中采样一个长度为 3 的向量,并将每个向量存储在输出矩阵的每一行中。(在我的实际代码中,我对每次绘制进行一系列操作,计算结果出现在另一个矩阵中的次数,然后将该数字保存在我的最终输出中。但我认为这与我的问题无关。 )

fn <- function(sample_size, J){
  # Preallocate output matrix
  output <- matrix(NA, nrow = sample_size, ncol = J)
  foreach (i = 1:sample_size, .combine = 'rbind') %dopar% {
    output[i, ] <- runif(J)
    return(output)
    }
}

# Execute function in parallel 
system.cl = makeCluster(4)
registerDoParallel(system.cl)

fn(sample_size=100, J=3)

stopCluster(system.cl)
stopImplicitCluster()

在这种情况下,预分配对 foreach 有帮助吗?我担心的是,输出矩阵一旦被创建为一个大矩阵,然后被 foreach覆盖(而不是填充),因此只会浪费时间和内存。

4

0 回答 0