如何在分析R代码时验证函数评估的数量

时间:2013-09-27 12:56:59

标签: r profiling

使用Rprof类型函数分析R代码时,我们只花费在函数上花费的时间以及在函数和被调用者中花费的时间。但是,据我所知,我们没有得到评估给定函数的次数。

例如,假设我想比较两个集成函数:

integrate_1(myfunc, from = -Inf, to = Inf)
integrate_2(myfunc, from = -Inf, to Inf)

我可以很容易地看到每个函数花费了多少时间以及花费的时间,但我不知道如何检查每个集成函数中myfunc的评估次数。

谢谢,

2 个答案:

答案 0 :(得分:1)

实现Joran计数器方法的一种方法是使用trace函数。

例如,首先我们将计数器设置为零。 (为方便起见,在全球环境中指定。)

count <- 0

然后设置跟踪。这里我们在identity函数上设置它(它只返回你输入的值)。

trace("identity", quote(count <<- count + 1), print = FALSE)

现在每当调用identity时,count的值都会递增。 print = FALSE只是在调用函数时停止向控制台打印的消息。

让我们多次调用该函数并检查计数:

for(i in seq_len(123)) identity(1)
count
## [1] 123

答案 1 :(得分:0)

Rprof通过对计时器上的调用堆栈进行采样来工作。它不计算电话数。

它将采样的调用堆栈记录在一个文件中,虽然它不记录调用发生的行号,但这些样本仍然可用于查看导致时间花费的原因。

例如,如果您碰巧看到M个随机样本,并且您看到一个类似A的模式,呼叫B在N上调用C,那么您就知道该程序大致花费其时间的N / M分数(假设N> 1)。 如果你看到这样的事情,并且你可以想出一种方法来避免它的一部分,那么你将节省大部分时间。

Rprof附带了一个摘要工具,可以为您提供您提到的数字类型,但我发现这些数字无论如何都没用。 我更愿意真正了解正在发生的事情。