当运行一个有n次迭代的for循环时(在R中),是否有一种简单的方法来平均所有迭代中每个命令的时间?

drnojrws  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(101)

假设我有一个for循环,看起来像这样:

n <- 1000
for (i in 1:n) {
   command1 <- solve(matrix1)
   command2 <- solve(matrix2)
   ...
   commandP <- solve(matrixP)
   
   matrix1 <- update(matrix1)
   matrix2 <- update(matrix2)
   ...
   matrixP <- update(matrixP)
}

所以基本上,我是在求解P矩阵的逆,然后更新每个矩阵,并继续迭代,大约1000次。
我想得到求逆每个P矩阵的平均计算时间(也就是说,在所有1000次迭代中求平均值)。其他的则很小并且花费大约微秒。
有没有一个简单的内置函数可以实现这一点?
我知道我可以使用Sys.time()命令手动计算每一行的时间,但是这将是乏味的,并且在代码中非常混乱,因为我必须在每个矩阵计算之前和之后添加一行。

rqqzpn5f

rqqzpn5f1#

要获得运行每个矩阵转换所需的时间,您可以设置一个表达式列表并使用eval运行这些表达式。这对我来说有点快速和肮脏的方法-但它可能是一个解决方案...

list.of.functions = list(
 matrix1 = expression(cor(matrix(rnorm(100), ncol = 10))), # Quick
 matrix2 = expression(cor(matrix(rnorm(1000), ncol = 100))), # Slow
 matrix3 = expression(cor(matrix(rnorm(10000), ncol = 1000))) # Slower
)
elapsed = list.of.functions # Copy the size and anes (R takes care of casting to the new data type)
for(f in names(list.of.functions)){
    elapsed[[f]] = system.time({eval(list.of.functions[[f]])})["elapsed"]
}
do.call("rbind", elapsed)

如果将这样的输出保存为data.frame,每次迭代都有一列,则可以在其上运行rowMeans,以获得每个矩阵的平均运行时间。

# Set up empty data.frame for the timing results
elapsed.df = as.data.frame(matrix(NA, nrow = length(list.of.functions), ncol = n))
rownames(elapsed.df) = names(list.of.functions)
# Outer loop of iterations
for(i in seq_len(n)){
    # Inner loop of function evaluations
    for(f in names(list.of.functions)){
        elapsed.df[f, i] = system.time({eval(list.of.functions[[f]])})["elapsed"]
    }
}
rowMeans(elapsed.df)

没有最少的例子很难更详细地解释。

相关问题