0

私はソフトウェアの最適化に取り組んでおり、最も高価な行はコードのテキスト処理行です。プログラムを分解し、特定のセクションをコメントアウトすることで、ifステートメントの小さな議論がプログラムのボトルネックのほとんどを引き起こしていることがわかりました。声明の中でそれは尋ねます

allele1 %in% rownames(seqMat)

trueの場合、次のステートメントが呼び出されます。このifステートメントは何千回もループされ、プログラムの速度が大幅に低下します。私の質問は、プログラムをスピードアップするために、そのステートメントをどのように変更できるかということです。

4

1 に答える 1

4

すべての対立遺伝子に対して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 
于 2012-12-13T02:13:36.403 に答える