R 如何优化此功能?

R 如何优化此功能?,r,R,在2.8 GHz 8核Macbook Pro和32GB RAM上完成以下操作大约需要20分钟。我迭代了2800行,其中一列有一个包含数据帧的单元格,每个数据帧由8列和10-30个观察值组成 我试图通过使用apply函数对数据帧进行迭代来优化流程。score函数用于迭代数据帧行,我与apply一起使用 是否因为它与嵌套数据帧一起工作而需要如此长的时间 保存到函数中变量prod.data的$prod行的每个实例本身就是一个数据帧。数据帧中的另一列与此函数中的处理相关,例如行$stimuli.pitc

在2.8 GHz 8核Macbook Pro和32GB RAM上完成以下操作大约需要20分钟。我迭代了2800行,其中一列有一个包含数据帧的单元格,每个数据帧由8列和10-30个观察值组成

我试图通过使用apply函数对数据帧进行迭代来优化流程。score函数用于迭代数据帧行,我与apply一起使用

是否因为它与嵌套数据帧一起工作而需要如此长的时间

保存到函数中变量prod.data的$prod行的每个实例本身就是一个数据帧。数据帧中的另一列与此函数中的处理相关,例如行$stimuli.pitch[[1]],但还有大约40列。这一定会很慢吗

score <- function(row) {

  # grab the stimuli the user heard
  pitch_vec1 <- str.mel.to.vector(row$stimuli.pitch[[1]], "-")
  dur_vec1 <- produce.arrhythmic.durs(pitch_vec1)
  
  prod.data <- row$prod
  
  if (any(!is.na(prod.data['pitch']))) {
    pitch_vec2 <- as.vector(unlist(prod.data['pitch']))
    dur_vec2 <- as.vector(unlist(prod.data['dur']))
    
  }
  else {
    pitch_vec2 <- NA
  }
  
  if(length(pitch_vec2) < 3 | length(pitch_vec1) < 3) { # skip if there is not enough pitches 
    score <- NA
  }
  
  else {
    score <- score_alg(pitch_vec1, dur_vec1, pitch_vec2, dur_vec2)
  }
  score

}

#  compute scores
scores <- apply(dat, MARGIN = 1, score)

score简单的回答是,您在这里没有犯任何明显的错误(例如,不断增长的数据结构,而不是预先分配数据结构,未能将显然可以向量化的内容向量化……我建议将其作为一个起点(或对于较老的学校方法)

最明显的可能性是,您正在调用的一个或多个函数(
str.mel.to.vector
product.arrhythmic.durs
,等等)很慢。您可以(1)分析代码以查看哪些部分慢(例如)或(2)分别对这些函数进行基准测试,查看函数所用的总时间是否比为每行重复此操作序列所用的预期时间长(例如,使用
rbenchmark
microbenchmark
包)


还有一些小事情(例如,除了
unlist()
,您可能不需要
as.vector()
?如果可能,您可以通过制作对象矩阵而不是数据帧来加快速度?)但在你发现分析2800行是否需要这么长时间之前,尝试优化它们真的是不值得的…

请告诉我为什么会有否决票,这样我就可以了解如何提出更好的问题。我没有否决,但这读起来有点像“请为我修改代码”.您在优化方面有何想法/尝试过?您有没有分析过您的代码?您能否给出一个答案?什么是“很长时间”(多大的数据集,什么样的硬件)?你提到的所有函数都是什么?可能它们只是速度慢?代码没有被破坏,我只是想学习如何改进。使用函数是为了从以前的函数中优化它。不,我以前从未分析过代码。我可以返回一个最小的可复制示例,但我的问题是我的代码是否显示任何有故障的结构逻辑以及我的原因。如果没有,那么是的,我可以研究单个函数。有一个单独的方面专门用于。除非有更具体的编程问题,否则它不适合堆栈溢出。“这看起来好吗?”?这不是一个精确的问题。至少要包含运行代码所需的数据,否则我们必须在头脑中运行代码,这比R所能做的还要慢。现在是否足够精确?我不确定如何才能向您提供如此大量的数据。