我正在优化一个软件,最昂贵的行是代码的文本处理行。通过拆开程序并注释掉某些部分,我发现 if 语句中的一个小参数导致了程序中的大部分瓶颈。在声明中询问是否
allele1 %in% rownames(seqMat)
是真的,如果是这样,下面的语句将被调用。这个 if 语句循环了数千次,导致程序显着变慢。我的问题是,如何更改该语句以帮助加快程序速度?
我正在优化一个软件,最昂贵的行是代码的文本处理行。通过拆开程序并注释掉某些部分,我发现 if 语句中的一个小参数导致了程序中的大部分瓶颈。在声明中询问是否
allele1 %in% rownames(seqMat)
是真的,如果是这样,下面的语句将被调用。这个 if 语句循环了数千次,导致程序显着变慢。我的问题是,如何更改该语句以帮助加快程序速度?
您只能为所有等位基因调用%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
and==
并没有太大的改进:
system.time({
for (i in seq_along(a))
any(a[i] == b)
})
# user system elapsed
# 1.661 0.164 1.835