【问题标题】:Microbenchmark: Pass a variable to the functionMicrobenchmark:将变量传递给函数
【发布时间】:2018-01-21 01:33:50
【问题描述】:

有人建议我使用 microbenchmark() 而不是 system.time() 来测试函数的执行时间。我遇到了无法遍历我希望传递给函数的 N 个值的问题。

microbenchmark(function(n), times = 1)

我想对 n = 1,2,3....1000 使用微基准测试并将结果每次保存到一个列表中。有没有一种简单的方法可以将增加的参数传递给这个函数?循环似乎不起作用,因为从外部实际函数传递时 n 值似乎没有改变

microbenchmark(list = listoffunctions, times = 1)

我确实注意到您可以将列表传递给 list=,它会完全按照我想要的行为。如果列表格式为:

alist(function(n1), function(n2),...)

然后 microbenchmark() 会像我尝试做的那样返回每一个。我不知道如何创建一个 alist,或任何其他方式来创建一个实际上不会运行该函数,而只是列出它的函数列表。

我希望最终绘制出以几种不同方式运行函数之间的执行时间。

任何关于如何将变量传递到微基准测试、创建函数列表或更好的方法的提示都将不胜感激。

【问题讨论】:

    标签: r data-visualization


    【解决方案1】:

    我假设您使用的是一个名为 function通用 函数,而不是 R 关键字 function ...

    我想你要找的是call。我将从一个接受单个参数的函数开始:

    myfunc <- function(n) { Sys.sleep(n/1000); return(n); }
    myfunc(1000)
    # [1] 1000
    

    现在我们想知道这个函数在给定不同参数的情况下如何与自身进行比较。

    lst_o_funcs <- lapply(1:5, function(arg) call("myfunc", arg))
    lst_o_funcs
    # [[1]]
    # myfunc(1L)
    # [[2]]
    # myfunc(2L)
    # [[3]]
    # myfunc(3L)
    # [[4]]
    # myfunc(4L)
    # [[5]]
    # myfunc(5L)
    

    每一个看起来都像一个函数调用,并且根据call

    'call' returns an unevaluated function call

    如你所料,我们可以将其传递给microbenchmark

    library(microbenchmark)
    microbenchmark(list = lst_o_funcs, times = 5)
    # Unit: milliseconds
    #        expr      min       lq     mean   median       uq      max neval
    #  myfunc(1L) 1.480572 1.487500 1.571667 1.498804 1.505005 1.886452     5
    #  myfunc(2L) 2.478316 2.493631 2.592822 2.495090 2.497278 2.999797     5
    #  myfunc(3L) 3.484812 3.502680 3.700406 3.507421 3.997177 4.009940     5
    #  myfunc(4L) 4.481098 4.481462 4.592104 4.488391 4.499331 5.010237     5
    #  myfunc(5L) 5.147718 5.489052 5.432309 5.492335 5.509838 5.522602     5
    

    如果你真的想要,你可以单独命名它们:

    microbenchmark(list = setNames(lst_o_funcs, as.character(1:5)), times = 5)
    # Unit: milliseconds
    #  expr      min       lq     mean   median       uq       max neval
    #     1 1.424047 1.455773 1.683110 1.492606 2.004241  2.038885     5
    #     2 2.437472 2.492538 5.152970 2.507124 2.507854 15.819861     5
    #     3 3.480435 3.488093 3.591150 3.499034 3.500493  3.987695     5
    #     4 4.489849 4.520482 5.803837 5.028470 6.227514  8.752872     5
    #     5 5.449303 5.501087 5.631566 5.522602 5.565633  6.119206     5
    

    虽然那只是为了美观。

    【讨论】:

    • 如何传递给带有 2 个参数的函数?
    • Map 是“n”个参数,因为 lapply 是 1。
    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2011-01-18
    • 2015-05-02
    • 2015-12-17
    相关资源
    最近更新 更多