【问题标题】:Benchmark analysis and display results of analysis AND benchmark?基准分析和显示分析结果和基准?
【发布时间】:2013-02-18 15:02:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: r benchmarking


    【解决方案1】:

    这是一个使用两个函数的示例。第一个使用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
    

    这就是你想要的吗?

    【讨论】:

    • 我测试并且 data.table 快了 20 倍 :) +1 即使我们必须安装 2 个包:)
    【解决方案2】:

    我读这个问题的方式与 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
    }
    

    【讨论】:

    • 感谢您的回答+1,确实非常接近并且有帮助,只是我不需要在这里复制。编辑我的问题以(希望)使事情更清楚。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多