【问题标题】:For-Loop making code what optimizes over 7 constants inordinately slowFor-Loop 使优化超过 7 个常量的代码异常缓慢
【发布时间】:2015-11-22 16:46:54
【问题描述】:

我正在尝试运行一个代码,以寻找超过 20 年的流行病学数据的最佳预测措施。我正在优化模型超过 7 个常量,所以我的代码如下所示:

correcttot<-function(v,p,r){  
  correct3<-array(0,dim=c(10,10,10,10,10,10,10))
  for(i in 1:10){
    for(j in 1:10){
      for(k in 1:10){
        for(l in 1:10){ 
          for(m in 2:10){
            for(n in 2:10){
              for(o in 1:10){
                correct3[i,j,k,l,m,n,o]<-percentcorrect((i/10),(j/10),(20*k),(20*l),m,n,o,v,p,r)
              }
            }
          }
        }
      }
    }
  }
 print(correct3)
}

但这和糖蜜一样慢(大约需要 35 小时)。我知道在许多情况下 apply() 是比 for 循环更好的选择,但是在这种情况下有什么方法可以使用它吗?那会是什么样子?该函数(百分比正确)采用七个常数,然后是我的数据集 v、p、r 中的三个向量。该功能不是特别快,但这仍然需要非常非常长的时间。

非常感谢您。

【问题讨论】:

  • 这相当于 1000 万次正确调用。一个电话需要多长时间(或者说 10 个)? lapply 不会变魔术。一天只有 86,400 秒。
  • 一个调用大约需要 7 秒。所以这只是一个愚蠢的差事?
  • 它应该花费比 35 小时更长的时间。 7000 万秒等于 810 天,即 2.2 年。某些参数不能花很长时间。
  • 是的,如果结果是 NA 或 0,它就不会继续运行,其中很多都是。这是单次运行时 system.time 的读数 system.time(percentcorrect(.3,.4,40,100,10,5,4,v,s,p)) user system elapsed 5.141 0.028 5.241
  • 如果您发布更多代码,也许我们可以帮助优化。或者只是将 geofurbs 的答案标记为正确(他需要积分)并优化自己。顺便说一句,代码审查最好发布在该名称的 StackExchange 论坛上。

标签: r for-loop optimization apply


【解决方案1】:

你运行了 1000 万次百分比正确。尽一切可能加快该功能。如果它正在从磁盘读取您的向量,请尝试提前将所有内容存储在内存中。如果他们正在向控制台打印某些内容,请终止任何输出。

做任何事情 1000 万次都需要一段时间。

PS: 您可能会考虑其他优化方法,而不是暴力破解每个可能的答案。除非您的结果对于每个组合都是完全随机的,否则必须有一种更漂亮的方法来做到这一点。线性优化是一个丰富的领域。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2014-08-31
    • 2016-12-05
    • 2015-01-15
    • 2011-05-23
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多