2

可能,我只是错过了一个参数......但是,也许有人可以指出它:如何在 R 基准测试中运行分析并仍然将结果存储回某处?我知道 R 函数只能返回一个对象,但我可以在此处使用列表或粘贴基准测试结果并将分析结果存储在函数的返回值中。

但是,有没有办法评估基准(或system.time)和分析而不像这样运行两次?:

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

编辑:对不起,我对我真正想做的事情造成了一些困惑。也许用例更清楚:我没有典型的基准测试情况,我想检查我的自定义函数是否比其他函数更快。而是我在不同的机器上用不同的数据运行同样的东西。我在测试环境中不需要它,但在生产环境中——我只想让脚本的用户知道它花了多长时间。如果那是一个小时或更长时间,人们可以计划他们的午休时间:)。

4

3 回答 3

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

现在,s1包含s2每个函数的结果,基准测试结果将显示在屏幕上。

# > 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

我不确定 StackOverflow 对回答旧问题的看法,但在您编辑后似乎没有人真正回答。所以这里是:

要在 R 中为进程计时,您可以使用两种方法。第一个使用system.time(expression)并为您提供计算括号内表达式所需的时间。如果这在您的情况下不实用,您可以Sys.time()在操作之前和操作之后获得系统时间,然后减去两者。

如果这最终回答了您的问题,请接受解决方案:)

于 2014-11-17T11:12:56.440 回答
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 次复制的结果。如果您想注释结果,您可以使用 paste() 并且如果您想添加代表次数的参数:

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 回答