如何分析特定函数在 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()
rbenchmark
包
microbenchmark
包
或分析器(例如?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
【讨论】:
expression
s 是怎么回事?
@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')
... 不管x
和dt
是
只需将 ...
参数命名为:benchmark(using.tapply=tapply(x[, 1], x[, "f"], mean))
。
将每个测试放在自己的行上。然后您可以轻松地添加/删除它们。我看到使用expression
的最大问题是您可能会混淆查看您的代码的其他人。以上是关于如何分析特定函数在 R 中运行的时间长度的主要内容,如果未能解决你的问题,请参考以下文章