【问题标题】:How can i faster my code (matrix, sapply, lapply)我怎样才能加快我的代码(矩阵,sapply,lapply)
【发布时间】:2017-06-12 11:24:29
【问题描述】:

我使用此代码。但这非常耗时。我怎么能更快呢。有什么可以帮忙的吗?

veri=replicate(1000, sim.VSS(ncases=3000, nvariables=20, nfactors=1, meanloading=0.5,dichot=1,cut=0))
#save date set
for (i in 1:1000){
  write.csv(veri[,,i], paste("v_30002005d_", i, ".csv", sep=""))
}

#read csvs
files<- lapply(1:1000, function(x) { read.csv(paste0("v_30002005d_", x, ".csv"))}[,2:21])

formula<-  function(a){
  sapply(1:nrow(a), function(x) sapply(1:ncol(a), 
                                       function (y) {{ifelse((as.matrix(rowMeans(a)))[x,]+as.matrix(colMeans(a))[y]>=1 , a[x,y]+as.matrix(item.exam(a)$Item.Rel.woi)[y,],a[x,y])}})
  )}

new_mat=sapply(1:1000, function(z){t(formula(files[[z]]))})

【问题讨论】:

  • 哪部分慢?您是否尝试过分析代码以找到瓶颈?通过并行运行代码可以改进读/写。
  • 在写第三点之前,我想问一下:rowMeans 和 colMeans 需要矩阵对象吗?它们被创建为一维向量对象,除非您将它们转换为矩阵并且对矩阵进行子集化比对向量进行子集化效率低得多。
  • @RomanLuštrik,并行读/写遇到 I/O 瓶颈的可能性有多大?
  • @RomanLuštrik new_mat 太慢了
  • 实际上我想使用矩阵,因为在数据集中 (3000(row)x20(col)) 我计算 rowmeans 和 colmeans。然后如果这个总和大于 1,我添加项目可靠性这个值(例如 1+项目可靠性)。如果我使用矢量,我无法执行此过程。

标签: r time simulation lapply sapply


【解决方案1】:

两点:

  • 在 sapply(1:ncol(a)) 和 sapply(1:nrow(a)) 内的每次迭代中都会重新计算 rowMeans(a) 部分。 colMeans(a) 部分也是如此。对于一个需要太长时间并且维度 n 和 m 的时间为 O(m * n^2) 的大型对象(因此执行时间随着方形对象维度的立方而增加)。您可以在“公式”函数的开头计算行和列的平均值并将这些值分配给对象,而不是在闭包内填充任何东西。一种更简洁的方法是单独定义最里面的函数并对其进行函数调用(这可能会因调用而受到一些惩罚,但会使代码更加优雅和可跟踪)

  • 您可以使用 external 代替两个 sapply 的行和列,它是 ply 的二维版本。但是,要使其正常工作,必须对内部的函数进行矢量化。您可以通过 y

  • 定义函数 x 的矢量化版本

【讨论】:

  • 我不确定第二点会有多好。但第一个绝对值得。
  • 我更正了我的观点,因为情况更糟:有两个嵌套层,所以大 O 是立方体而不是正方形。
猜你喜欢
  • 1970-01-01
  • 2017-03-13
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多