如何分析特定函数在 R 中运行的时间长度

Posted

技术标签:

【中文标题】如何分析特定函数在 R 中运行的时间长度【英文标题】:How to analyze the length of time a specific function runs in R 【发布时间】:2012-12-04 18:33:34 【问题描述】:

我刚刚得到了一份工作,通过提高用于计算数据的算法的效率来帮助加速 R 中的程序。有许多循环进行不同的计算,我想知道哪些循环最终使用最多的资源。我想知道如何计算一个循环完全完成所需的时间。我可以使用这些信息来确定要优化哪些算法,甚至可以编写一个 C 扩展来处理这些计算。

【问题讨论】:

【参考方案1】:

你可以使用:

Sys.time()system.time() rbenchmarkmicrobenchmark 包 或分析器(例如?RProf

【讨论】:

你按顺序列出来了吗? 对于第一个要点,您可以使用beg <- Sys.time(); MyCode() ; Sys.time() - beg system.time( MyCode() ),这可能更可取。 谢谢你,这很有帮助!【参考方案2】:

我使用Rprof 来告诉你去哪里看。 它会生成一个堆栈样本文件,我只查看随机选择的一小部分,比如 10 个。 或者我只是让样本之间的时间足够大,这样一开始就不会得到太多样本。

这有两个原因。

1) 通过实际检查单个堆栈样本,您可以亲眼看到简单统计数据无法揭示的问题,因为通过查看堆栈,您可以了解事情发生的原因。这会告诉您是否可以摆脱它,这是基本信息。

2) 如果您发现这种可以改进的活动模式,您只需在多个样本上看到它,就知道它值得修复。 所有额外的样本,如果它们意味着你不能做(1),实际上是有害的。

【讨论】:

【参考方案3】:

这里是使用来自another SO questions 的基准测试的示例,比较了使用tapply vs by vs data.table根据 cmets 编辑

library(rbenchmark)  

           # Different tests being compared
benchmark( using.tapply = tapply(x[, 1], x[, "f"], mean),
           using.by = by(x[, 1], x[, "f"], mean), 
           using.dtable = dt[,mean(col1),by=key(dt)]), 

           # Number of reps. How results are.
           replications = 250, order = "relative"
          )   

#------------------------#
#         RESULTS        # 
#------------------------#


#   COMPARING data.table VS tapply VS by   #
#------------------------------------------#
#             test elapsed relative
#   2  using.dtable   0.168    1.000
#   1  using.tapply   2.396   14.262
#   3      using.by   8.566   50.988

【讨论】:

expressions 是怎么回事? @GSee。我喜欢将它们保存为表达式,这样我就可以在所有测试中轻松更改输入。 (另外,我发现它在test 列中提供了更好的输出) benchmark(using.tapply=tappyl(x[, 1], x[, "f"], mean), using.by=by(x[, 1], x[, "f"], mean), using.dtable=dt[, mean(col1),by=key(dt)], replications=10, order='relative') ... 不管xdt 只需将 ... 参数命名为:benchmark(using.tapply=tapply(x[, 1], x[, "f"], mean)) 将每个测试放在自己的行上。然后您可以轻松地添加/删除它们。我看到使用expression 的最大问题是您可能会混淆查看您的代码的其他人。

以上是关于如何分析特定函数在 R 中运行的时间长度的主要内容,如果未能解决你的问题,请参考以下文章

如何分析 Rcpp 代码(在 linux 上)

如何在 R 中创建类似 swirl() 的函数?

如何在画布构造函数中将文本放在特定宽度和长度之间

如何将自定义函数加载到 R 中的 foreach 循环中?

如何遍历所有行和特定列来计算函数?

如何编写 R 函数来查找数据框中的特定条件