Rmdでchunkごとの実行時間を計測

カテゴリ: r

Jupyter Notebookでは、コードブロック冒頭で %%timeit と唱えると、ブロックの評価に要した時間を表示できる。
https://jakevdp.github.io/PythonDataScienceHandbook/01.07-timing-and-profiling.html

これをRmdでもできないかなー? と思って knit_hooks() を利用してみた。 knit_hooks() の使い方の詳細はこちら

実装

hook用の関数の引数として beforeenvir を用意しておく。

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するとよい。

Translations