分析函数时间作为两个参数的函数
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)
我想了解执行时间如何随i
和j
变化。
有没有办法在 R 中对此进行分析?
我想要得到类似于执行时间的二维矩阵的东西,i
和 j
分别在 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?
希望这有帮助!
【讨论】:
以上是关于分析函数时间作为两个参数的函数的主要内容,如果未能解决你的问题,请参考以下文章