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 setosa0.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するとよい。
Atusy's blog