【发布时间】:2014-08-21 11:28:21
【问题描述】:
免责声明
大家好!我最近开始使用 R 进行编程。我的代码运行良好,但就速度而言,其中一些代码花费的时间太长而无法充分利用。我希望有人可以通过优化代码或使用其中一个多核包来帮助我使这段代码运行得更快。
关于代码
我有大型数据集,每个数据集包含大约 15000 个数字数据。该代码采用两个参数 (p, n),其中 p >= n,并生成数据的子集。它将 zyp.yuepilon 函数(来自 zyp 包)应用于子集的每一行。然后参数 n 用于在 n 大小的子集上应用相同的函数。
问题是我在嵌套的 for 循环中运行此代码:p 在 10:40 和 n 在 10:40,因此需要很长时间才能获得结果,而且它只是许多其他数据集中的一个。
sp <- function(p, n){
library(zyp)
data <- runif(15000, 1, 4)
lower <- seq(80 - p + 1, by=1, length.out=length(data)-81)
upper <- lower + p - 1
subsets <- matrix(nrow=length(lower), ncol=p)
for(j in 1:length(lower)){
subsets[j, ] = data[lower[j] : upper[j]]
}
ret <- apply(subsets, 1, zyp.yuepilon)
subset_n <- subsets[, 1:n]
ret2 <- apply(subset_n, 1, zyp.yuepilon)
return(list(ret, ret2))
}
基准测试结果以秒为单位:
expr min lq median uq max neval
sp(7, 6) 92.77266 94.24901 94.53346 95.10363 95.64914 10
【问题讨论】:
-
如果代码太慢,第一步是分析。见
help("Rprof")。 -
^ 是的,你需要找出时间花在哪里以避免过早优化。
-
但是,我怀疑
zyp.yuepilon是您的瓶颈。编写更快的实现或使用并行化。 -
这个问题似乎离题了,因为它是关于优化工作代码的;它更适合 codereview.stackexchange.com。
-
感谢 cmets,我非常感谢他们。我使用了 profiling,而 zyp.yuepilon 是 Roland 所写的瓶颈。我尝试使用降雪包,但并没有真正变得更快。确实是题外话,谢谢指出。以后会多加注意的。
标签: r performance loops nested-loops multicore