分析函数时间作为两个参数的函数

Posted

技术标签:

【中文标题】分析函数时间作为两个参数的函数【英文标题】:Profiling function time as a function of two parameters 【发布时间】:2016-12-21 02:49:28 【问题描述】:

假设我有一个需要两个输入的函数:

myfun = function(i,j)
  fac = factorial(i)
  c0 = crossprod(matrix(rnorm(j*j),nrow=j), matrix(rnorm(j*j),nrow=j))
  return(fac + c0)

我想了解执行时间如何随ij 变化。

有没有办法在 R 中对此进行分析?

我想要得到类似于执行时间的二维矩阵的东西,ij 分别在 x 和 y 轴上。

【问题讨论】:

【参考方案1】:

鉴于您所描述的功能,您应该能够单独分析每个参数,然后根据您的选择添加时间,因为参数是相互独立的。但是,为了回答您的问题,这是我想出的:

# wrap function in timer
myfun_time <- function(i,j, type = "user.self")

  system.time(myfun(i,j))[type]

 

# choose points to evaluate at
i_vals <- c(0,10,50,100,120)
j_vals <- c(0,10,50,100,150)

# create evaluation matrix (all combinations of points)
eval_mat <- expand.grid(i = i_vals, j = j_vals)

# create matrix to help with location of points when moving from vector to matrix
loc_mat <- as.matrix(expand.grid(i = 1:length(i_vals), j = 1:length(j_vals)))

# run test
results_vec <- mapply(myfun_time, i = eval_mat$i, j = eval_mat$j)

# empty matrix to store results
results_mat <- matrix(NA, nrow = sqrt(nrow(eval_mat)), ncol = sqrt(nrow(eval_mat)), 
              dimnames = list(i_vals,j_vals))

# move results vector to matrix
results_mat[loc_mat] <- results_vec

# you can also repeat this and average the results...

【讨论】:

【参考方案2】:

您可以使用proc.time 命令。这应该有效:

# Creates a matrix with i_max, j_max dimentions
times <- matrix(nrow = i_max, ncol = j_max)

for (i in 1:i_max) 
    for (j in 1:j_max) 
        # Start the clock
        ptm <- proc.time()

        # Execution
        exec <- myfun(i, j)

        # Final time
        time <- proc.time() - ptm

        # Adding it to the time matrix
        times[i, i] <- time[,1]
    


# Show the times matrix
times

这将创建您提到的矩阵。我之所以选择time[,1],是因为proc.time()返回3个值,而与函数执行有关的是第一个,你可以在这里阅读:R FAQ How can I time my code?

希望这有帮助!

【讨论】:

以上是关于分析函数时间作为两个参数的函数的主要内容,如果未能解决你的问题,请参考以下文章

Hive分析函数LAG和LEAD详解

用结构体函数计算两个复数的四则运算的程序分析、重难点和结论?

slice切片做函数参数

[反汇编]对于函数传入参数时的分析

分析多继承下的动态多态。

以毫秒为单位获取时间来分析函数持续时间