【问题标题】:Speed up text processing in R加速 R 中的文本处理
【发布时间】:2012-12-13 01:29:41
【问题描述】:

我正在优化一个软件,最昂贵的行是代码的文本处理行。通过拆开程序并注释掉某些部分,我发现 if 语句中的一个小参数导致了程序中的大部分瓶颈。在声明中它询问是否

allele1 %in% rownames(seqMat)

为真,如果是,则调用后面的语句。这个 if 语句循环了数千次,导致程序显着变慢。我的问题是,如何更改该语句以帮助加快程序速度?

【问题讨论】:

  • 试试any(alllel1 == rownames(seqMat))
  • 您可以在循环之前为所有等位基因调用一次%in%,并将其输出(布尔向量)存储在循环内以供重复使用。 (假设你的循环遍历等位基因)
  • 您能提供更多信息吗?为什么会循环这么多次?是否有已检查的等位基因列表或 seqMat 是众多文件之一?
  • 另外,下次使用Rprof。比评论和取消评论要好得多。

标签: performance r optimization text


【解决方案1】:

您可以只为所有等位基因调用一次%in%,并将其输出存储起来以供循环内重复使用。这是一个概念证明:

a <- sample(1:1000, 100000, replace = TRUE)
b <- -1000:1000

system.time({
    stored <- a %in% b
    for (i in seq_along(a))
        stored[i]
}) 
#    user  system elapsed 
#   0.056   0.001   0.056 

system.time({
    for (i in seq_along(a))
        a[i] %in% b
})
#    user  system elapsed 
#   3.634   0.374   3.957

此外,Hadley 建议使用 any== 并没有太大的改进:

system.time({
    for (i in seq_along(a))
        any(a[i] == b)
})
#    user  system elapsed 
#   1.661   0.164   1.835 

【讨论】:

  • 我有一些变量在 for 循环中重新分配为 x 列中的第 i 行,即我的 allele1 变量在循环的每次迭代中重新分配。这使事情变得更加复杂。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 2018-04-07
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多