シミュレーションなどで,使用する乱数をまとめて発生させておいて後で使うというようにすれば効率的であるといわれるが,メモリーギリギリでやるような場合には,それが裏目に出るという実例。おまけに,この場合は for ではなく apply を使ったのに...ということなのだ。
> n <- 1000
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 389200 20.8 1307810 69.9 2554318 136.5
Vcells 815860 6.3 101994529 778.2 151544141 1156.2
> set.seed(123)
> system.time({
+ x <- matrix(rnorm(50*n), 50)
+ m <- apply(x, 2, median)
+ })
ユーザ システム 経過
0.068 0.001 0.069 小規模な場合は,確かにまとめて取る方が効率的
> set.seed(123)
> system.time({
+ m <- numeric(n)
+ for (i in seq_len(n)) {
+ m[i] <- median(rnorm(50))
+ }
+ })
ユーザ システム 経過
0.086 0.001 0.093
> n <- 1000000
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 385959 20.7 1259264 67.3 1835812 98.1
Vcells 51544018 393.3 149518151 1140.8 105639609 806.0
> system.time({
+ x <- matrix(rnorm(50*n), 50)
+ m <- apply(x, 2, median)
+ })
ユーザ システム 経過
73.343 0.863 73.887 大規模な場合は,逆に遅くなってしまう
> system.time({
+ m <- numeric(n)
+ for (i in seq_len(n)) {
+ m[i] <- median(rnorm(50))
+ }
+ })
ユーザ システム 経過
66.355 0.629 66.733