0

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

allele1 %in% rownames(seqMat)

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

4

1 回答 1

4

您只能为所有等位基因调用%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 建议使用anyand==并没有太大的改进:

system.time({
    for (i in seq_along(a))
        any(a[i] == b)
})
#    user  system elapsed 
#   1.661   0.164   1.835 
于 2012-12-13T02:13:36.403 回答