2

おそらく、パラメーターを見逃しただけです...しかし、誰かが私にそれを指摘できるかもしれません:Rベンチマークで分析を実行し、結果をどこかに保存する方法はありますか?. R 関数が 1 つのオブジェクトしか返せないことはわかっていますが、ここでリストを使用するか、ベンチマーク結果を貼り付けて、関数の戻り値に分析を保存することができます。

しかし、このように 2 回実行せずにベンチマーク (またはsystem.time) と分析を評価する方法はありますか?:

require(rbenchmark)
bmark <- function(x){
    res <- list()
    res[[1]] <- benchmark(x^6)
    res[[2]] <- x^6
    res
}

編集:本当にやりたいことについて混乱を招いて申し訳ありません。たぶん、ユースケースがそれをより明確にします: カスタム関数が他の関数よりも速いかどうかを確認したい典型的なベンチマーク状況はありません。むしろ、異なるマシンで異なるデータを使用して同じことを実行するということです。これはテスト環境では必要ありませんが、本番環境では必要です。スクリプトのユーザーに、スクリプトにかかった時間を知らせたいだけです。それが 1 時間以上であれば、昼休みを計画できます :) 。

4

3 に答える 3

8

2 つの関数を使用した例を次に示します。最初のものは を使用plyrし、2 番目は を使用しdata.tableます。

# dummy data
require(plyr)
require(data.table)
set.seed(45)
x1 <- data.frame(x=rnorm(1e6), grp = sample(letters[1:26], 1e6, replace=T))
x1.dt <- data.table(x1, key="grp")
# function that uses plyr   
DF.FUN <- function(x) {
    ddply(x1, .(grp), summarise, m.x = mean(x))
}

# function that uses data.table
DT.FUN <- function(x) {
    x1.dt[, list(m.x=mean(x)),by=grp]
}

require(rbenchmark)
> benchmark( s1 <- DF.FUN(), s2 <- DT.FUN(), order="elapsed", replications=2)

#             test replications elapsed relative user.self sys.self user.child sys.child
# 2 s2 <- DT.FUN()            2   0.036    1.000     0.031    0.006          0         0
# 1 s1 <- DF.FUN()            2   0.527   14.639     0.363    0.163          0         0

これで、各関数の結果が含まれs1s2ベンチマーク結果が画面に表示されます。

# > head(s1)
#   grp           m.x
# 1   a  0.0069312201
# 2   b -0.0002422315
# 3   c -0.0129449586
# 4   d -0.0036275338
# 5   e  0.0013438022
# 6   f -0.0015428427

# > head(s2)
#    grp           m.x
# 1:   a  0.0069312201
# 2:   b -0.0002422315
# 3:   c -0.0129449586
# 4:   d -0.0036275338
# 5:   e  0.0013438022
# 6:   f -0.0015428427

これはあなたが求めていたものですか?

于 2013-02-18T15:07:02.483 に答える
1

私はアルンとは少し違った方法で質問を読みました。これは私が尋ねられていたと思ったものに対する答えになるでしょう:

 > bres <- bmark(2)
> bres
[[1]]
  test replications elapsed relative user.self sys.self user.child sys.child
1  x^6          100   0.001        1     0.001    0.001          0         0

[[2]]
[1] 64

bmark関数は、デフォルトの100回のレプリケーションで結果を返します。past()を使用して結果に注釈を付けたい場合、および担当者数のパラメーターを追加したい場合は、次のようにします。

bmark2 <- function(x, reps=100){
    res <- list()
    res[[1]] <- benchmark(x^6, replications=reps)
    res[[2]] <- paste(reps, " replications of ", x, "to the 6th in", res[[1]]$elapsed)
    res
}
于 2013-02-18T17:52:47.923 に答える
1

StackOverflow が古い質問への回答についてどう考えているかはわかりませんが、編集後に実際に回答した人は誰もいないようです。だからここに行きます:

R でプロセスの時間を計測するには、2 つの方法を使用できます。最初のものはsystem.time(expression)、括弧内の式を評価するのにかかった時間を使用して示します。これが実用的でない場合はSys.time()、操作前と操作後のシステム時間を取得して、2 つを差し引くことができます。

これが最終的にあなたの質問に答えるなら、解決策を受け入れてください:)

于 2014-11-17T11:12:56.440 に答える