次のように我々は(そのことについてまたはdata.frame
)vector
をしましたとします 「論理型」型のサブセット化が「数値型」型のサブセット化より遅いのはなぜですか?
set.seed(1)
x <- sample(10, 1e6, TRUE)
を、もう1つは
x
どこ
x > 4
のすべての値を取得したい、と言う:
a1 <- x[x > 4] # (or)
a2 <- x[which(x > 4)]
identical(a1, a2) # TRUE
私が最も考えます人々はx[x > 4]
を好むだろう。しかし、驚いたことに(少なくとも私に)which
を使用してサブセット化する方が高速です!
require(microbenchmark)
microbenchmark(x[x > 4], x[which(x > 4)], times = 100)
Unit: milliseconds
expr min lq median uq max neval
x[x > 4] 56.59467 57.70877 58.54111 59.94623 104.51472 100
x[which(x > 4)] 26.62217 27.64490 28.31413 29.97908 99.68973 100
鉱山では約2.1倍の速さです。
which
はNA
とは考えていませんが、>
も同様の違いが考えられます。しかし、論理的な操作自体は、ではないケース(明らかに)であるこの違いの理由でなければなりません。すなわち、
microbenchmark(x > 4, which(x > 4), times = 100)
Unit: milliseconds
expr min lq median uq max neval
x > 4 8.182576 10.06163 12.68847 14.64203 60.83536 100
which(x > 4) 18.579746 19.94923 21.43004 23.75860 64.20152 100
which
を使用すると、サブセット化の直前に約1.7倍遅くなります。しかし、which
は、サブセット化の際に/その間に大幅に追い付いているようです。
which
通話.Internal(which(x))
==
に対し、通話.Primitive("==")
として選択debugonce
(thanks to @GavinSimpson)の私のいつもの武器を使用することはできないようです。
[
がnumeric
の場合は、>
の論理ベクトルよりもwhich
の方が速いのはなぜですか?何か案は?
ありがとうKohske。私の質問は基本的に*なぜ*この場合です。私はこれをより明確にするために編集を行った。 – Arun
更新されましたが、実際にオーバーヘッドがどこにあるかを知りたい場合は、送信するソースコード(c実装)を掘り下げてください。 – kohske
あなたの最初の文章は、質問の新しいタイトルに照らして陽気に同義語のように聞こえるので、この記事を少し更新したいかもしれません。 – Thomas