2013-02-18 80 views
2

也許我只是錯過了一個參數......但是,也許有人可以指出我:R如何在R基準分析中運行分析,並將結果存儲回某處?我知道R函數只能返回一個對象,但我可以在這裏使用一個列表或者粘貼基準測試結果並將分析存儲在函數的返回值中。基準分析和顯示結果的分析和基準?

但是,有沒有什麼辦法來評估基準(或system.time)和分析,而不運行它兩次這樣?:

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

編輯:我很抱歉,我引起了我真正想要做一些混亂。也許用例更清楚:我沒有典型的基準情況,我想檢查自定義函數是否比其他函數更快。相反,我使用不同機器上的不同數據來運行相同的事情。在測試環境中,我不需要這些,但是在生產環境中 - 我只想讓腳本的用戶知道需要多長時間。如果這是一個小時或更多的人可以計劃他們的午餐時間:)。

回答

8

下面是一個使用兩個函數的示例。第一個使用plyr,第二個使用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 

這是你以後?

+1

我測試和data.table是快20倍:) +1即使我們必須安裝2包:) – agstudy 2013-02-18 15:11:23

1

我讀到的問題與Arun有點不同。這將是我以爲被問到的答案:

> 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個重複的結果。它你想註釋,你可以用漿糊()的結果,如果你想添加一個參數代表的人數:

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 
} 
+0

謝謝你的答案+ 1,事實上這非常接近並有所幫助,只是我不需要在這裏複製。編輯我的問題(希望)使事情更清楚。 – 2013-02-19 09:31:13

1

我不確定什麼StackOverflow上想的回答古老的問題,但似乎沒有人實際上在您編輯後回答。所以在這裏:

要在R中計算進程,您可以使用兩種方法。 第一個使用system.time(expression),併爲您提供多少時間來評估括號內的表達式。 如果這種情況在您的情況下不可行,您可以在操作之前和操作之後使用Sys.time()獲取系統時間,然後減去兩者。

如果這最後回答你的問題,請接受的解決方案:)