我正在努力优化一个软件,而最昂贵的行是代码的文本处理行。通过拆分程序并对某些部分进行评论,我发现if语句中的一个小参数正在导致程序中的大部分瓶颈。在声明中,它询问是否
allele1 %in% rownames(seqMat)
是真的,如果是这样,将调用后面的语句。此if语句循环数千次,导致程序显着减慢。我的问题是,如何更改该声明以帮助加快该计划?
答案 0 :(得分: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关于使用any
和==
的建议并没有那么大的改进:
system.time({
for (i in seq_along(a))
any(a[i] == b)
})
# user system elapsed
# 1.661 0.164 1.835