5

大きなデータセットで大規模なデータ操作を行う必要があります(主にdata.table、RStudioを使用)。各ステップで明示的に system.time() を呼び出さずに、各ステップの実行時間を監視したいと思います。

各ステップでデフォルトで実行時間を表示するパッケージまたは簡単な方法はありますか?

ありがとうございました。

4

2 に答える 2

5

それはまさにあなたが求めているものではありませんが、私はRファイルでtime_fileある(https://gist.github.com/4183595)をsource()書き、コードを実行してからファイルを書き換え、それぞれの長さを含むコメントを挿入しました最上位ステートメントの実行にかかった。

つまりtime_file()、次のようになります。

{
  load_all("~/documents/plyr/plyr")
  load_all("~/documents/plyr/dplyr")
  library(data.table)
  data("baseball", package = "plyr")
  vars <- list(n = quote(length(id)), m = quote(n + 1))
}

# Baseline case: use ddply
a <- ddply(baseball, "id", summarise, n = length(id))

# New summary method: ~20x faster
b <- summarise_by(baseball, group("id"), vars)

# But still not as fast as specialised count, which is basically id + tabulate
# so maybe able to eke out a little more with a C loop ?
count(baseball, "id")

これに:

{
  load_all("~/documents/plyr/plyr")
  load_all("~/documents/plyr/dplyr")
  library(data.table)
  data("baseball", package = "plyr")
  vars <- list(n = quote(length(id)), m = quote(n + 1))
}

# Baseline case: use ddply
a <- ddply(baseball, "id", summarise, n = length(id))
#:    user  system elapsed
#:   0.451   0.003   0.453

# New summary method: ~20x faster
b <- summarise_by(baseball, group("id"), vars)
#:    user  system elapsed
#:   0.029   0.000   0.029

# But still not as fast as specialised count, which is basically id + tabulate
# so maybe able to eke out a little more with a C loop ?
count(baseball, "id")
#:    user  system elapsed
#:   0.008   0.000   0.008

最上位{ブロック内のコードの時間を計測しないため、興味のないものを計測しないことを選択できます。

コードの実行方法を何らかの形で変更せずに、最上位の効果としてタイミングを自動的に追加する方法はないと思います。つまりtime_filesource.

すべての最上位操作のタイミングがコードの全体的な速度に与える影響について疑問に思うかもしれません。まあ、それはマイクロベンチマークで簡単に答えられます ;)

library(microbenchmark)
microbenchmark(
  runif(1e4), 
  system.time(runif(1e4)),
  system.time(runif(1e4), gc = FALSE)
)

したがって、タイミングによって追加されるオーバーヘッドは比較的わずかですが (私のコンピューターでは 20µs)、デフォルトの gc では呼び出しごとに約 27 ミリ秒が追加されます。したがって、何千ものトップレベルの呼び出しがない限り、大きな影響は見られません。

于 2012-12-01T18:02:15.783 に答える
0

この追加の回答については、 @jbeckerのIRC チャンネルに 完全なクレジットを与える必要がありFreenodeますが、私にとっての解決策は次のとおりです: http://adv-r.had.co.nz/Profiling.html#R

以下はそのほんの一部です。

「パフォーマンスを理解するには、プロファイラーを使用します。プロファイラーにはさまざまな種類があります。R は、サンプリングまたは統計プロファイラーと呼ばれるかなり単純なタイプを使用します。サンプリング プロファイラーは、数ミリ秒ごとにコードの実行を停止し、現在どの機能が使用されているかを記録します。実行中 (その関数を呼び出した関数など)。たとえば、以下の f() を考えてみましょう:"

library(lineprof)
f <- function() {
  pause(0.1)
  g()
  h()
}
g <- function() {
  pause(0.1)
  h()
}
h <- function() {
  pause(0.1)
}
于 2014-08-19T15:03:36.030 に答える