差を強調したいがために,基本を忘れている。
> num = 50000
> ### 配列を拡張していく ###
> gc(); gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340948 18.3 597831 32.0 597831 32.0
Vcells 602119 4.6 1162592 8.9 1162586 8.9
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3 597831 32.0 597831 32.0
Vcells 602146 4.6 1162592 8.9 1162586 8.9
> system.time({
+ x <- numeric(0)
+ i <- 1
+ while (i <= num) {
+ x[i] <- i
+ i <- i + 1
+ }
+ })
ユーザ システム 経過
5.788 0.317 6.078
> ### 配列を一度に初期化 ###
> gc(); gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3 597831 32.0 597831 32.0
Vcells 602140 4.6 1162592 8.9 1162592 8.9
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3 597831 32.0 597831 32.0
Vcells 602146 4.6 1162592 8.9 1162592 8.9
> system.time({
+ x <- numeric(num)
+ i <- 1
+ while (i <= num) {
+ x[i] <- i
+ i <- i + 1
+ }
+ })
ユーザ システム 経過
0.181 0.001 0.193
while は,初期化,判定,加算が必要なので,無駄が多い。
for の替わりに使うべきものではない。
> ### 配列を一度に初期化 ### for があるんだからfor を使う
> gc(); gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3 597831 32.0 597831 32.0
Vcells 621526 4.8 1162592 8.9 1162592 8.9
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3 597831 32.0 597831 32.0
Vcells 621532 4.8 1162592 8.9 1162592 8.9
> system.time({
+ x <- numeric(num)
+ for (i in 1:num) {
+ x[i] <- i
+ }
+ })
ユーザ システム 経過
0.128 0.000 0.165
> ### 配列を一度に初期化 ### for, seq.int を使う
> gc(); gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3 597831 32.0 597831 32.0
Vcells 621526 4.8 1162592 8.9 1162592 8.9
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3 597831 32.0 597831 32.0
Vcells 621532 4.8 1162592 8.9 1162592 8.9
> system.time({
+ x <- numeric(num)
+ for (i in seq.int(num)) {
+ x[i] <- i
+ }
+ })
ユーザ システム 経過
0.105 0.001 0.105
> # 瞬殺
> gc(); gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3 597831 32.0 597831 32.0
Vcells 644789 5.0 1162592 8.9 1162592 8.9
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3 597831 32.0 597831 32.0
Vcells 644795 5.0 1162592 8.9 1162592 8.9
> system.time({x <- seq(num)}) # これを忘れちゃいけないでしょう
ユーザ システム 経過
0 0 0
> system.time({x <- seq.int(num)})
ユーザ システム 経過
0 0 0
> system.time({x <- seq_len(num)})
ユーザ システム 経過
0.001 0.000 0.000
※コメント投稿者のブログIDはブログ作成者のみに通知されます