餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

RでFizzBuzz問題を高速化

「裏 RjpWiki」で「R らしく FizzBuzz」と言うエントリーがあるのですが、ワンライナーですっきりしていますが、速度的にちょっと彼らしくない書き方になっています。
ifelse()を減らせば、もっと速度が改善しますよ。手元の計測では裏 RjpWiki版が4.96秒、ifelse()削減版が2.09秒でした。

### 100万回演算 ###
i <- 1:1000000

### 裏 RjpWiki版 ###
gc(); gc()
system.time({
r1 <- ifelse(i %% 15 == 0, "FizzBuzz", ifelse(i %% 3 == 0, "Fizz", ifelse(i %% 5 == 0, "Buzz", i)))
})

### ifelse関数を減らした版 ###
gc(); gc()
system.time({
l <- c("", "Fizz", "Buzz", "FizzBuzz")
ii <- (0==i%%5)*2 + (0==i%%3)*1 + 1
r2 <- ifelse(1<ii, l[ii], i)
})

### 計算結果が同一なのを確認 ###
all(r1==r2)