Jupyter Notebookでは、コードブロック冒頭で %%timeit
と唱えると、ブロックの評価に要した時間を表示できる。
https://jakevdp.github.io/PythonDataScienceHandbook/01.07-timing-and-profiling.html
これをRmdでもできないかなー? と思って knit_hooks()
を利用してみた。
knit_hooks()
の使い方の詳細はこちら。
実装
hook用の関数の引数として before
と envir
を用意しておく。
before
は論理値でhookをchunk実行前に呼び出しているか (before == TRUE
)、後に呼び出しているか (before == FALSE
) を教えてくれる。
envir
はhookが呼び出された環境を教えてくれる。
時間を計測するには、chunk実行前の時刻を保存しておき、実行後の時刻から差し引く。
その保存先に、hookが呼び出された環境を指定する。
環境ってなんぞって人は、kohskeさんの記事「Rの)環境問題について その1」やHadleyのAdv. Rを参照。
before == TRUE
なら、envir
に適当な変数名で現在の時刻を記録before == FALSE
なら、 現在時刻からenvir
に記録された時刻を差し引く- 差し引いた値を 文字列 として返す (さもなくば表示されないっぽい)
library(knitr)
knit_hooks$set(
time = function(before, envir) {
t <- proc.time()['elapsed']
if(before) {
envir$.elapsed <- t
} else {
paste(t - envir$.elapsed, 'sec.')
}
}
)
テスト
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
0.079 sec.
できた!
Tips
時間を測りたくない場合はchunk optionで time = FALSE
。
特定のchunkのみを測りたい場合は setup chunkで knitr::opts_chunk$set(time = TRUE)
とし、特定のchunkでのみchunk optionに time = TRUE
を指定する。
発展させたい
hookを利用して、knit
時に (!) チャンクの評価に要した時間を表示させることに成功した。
しかしこの方法では、RStudioのエディタには経過時間を表示できない。
ここでも表示されると嬉しいな。
ちなみに、R Notebookでは、.nb.htmlでは経過時間が記録されているので積極的にPreviewするとよい。