算額あれこれ

算額問題をコンピュータで解きます

ダメ出し:小細工せずに素直に(あるいは,効果を確かめてから)

「kingqwertの覚書」 の
http://d.hatena.ne.jp/kingqwert/
2012-08-22 の項
http://d.hatena.ne.jp/kingqwert/20120822

「リサイクル規則をうまく使う方法」を挙げてあるが,そんなに良い方法ではない。内部では結局の所リサイクル処理をしているので,1:(n%/%2)*2 のように選択する添え字ベクトルを指定してやるのと同等の速度である。むしろ,一番最後の例のように,添え字が整数ベクトルになるようにすれば,一番速い。

> n <- 10000000L
> a <- rnorm(n)
>
> invisible(gc()); invisible(gc()); system.time({
+     x <- a[seq_along(a) %% 2 == 0]
+ })
   ユーザ   システム       経過  
     0.363      0.010      0.371
> invisible(gc()); invisible(gc()); system.time({
+     y <- a[!(seq_along(a) %% 2)]
+ })
   ユーザ   システム       経過  
     0.345      0.000      0.344
> invisible(gc()); invisible(gc()); system.time({
+     z <- a[c(FALSE,TRUE)]
+ })
   ユーザ   システム       経過  
     0.076      0.001      0.077
> invisible(gc()); invisible(gc()); system.time({
+     u <- a[1:(n%/%2)*2]
+ })
   ユーザ   システム       経過  
     0.063      0.001      0.063
> invisible(gc()); invisible(gc()); system.time({
+     v <- a[1:(n%/%2)*2L]                        # 最速!!
+ })
   ユーザ   システム       経過  
     0.048      0.000      0.048

> all(x == y)
[1] TRUE
> all(x == z)
[1] TRUE
> all(x == u)
[1] TRUE
> all(x == v)
[1] TRUE