【发布时间】:2018-08-16 19:08:22
【问题描述】:
我希望比我更有知识的人能帮助优化这段代码。我尝试了许多方法,包括使用 doparallel(和雪)和编译器的 foreach,但我认为可能有更简单的方法来改进代码,例如将数据帧更改为数据表/矩阵,并且可能预加载空白对象在一个循环中连接向量。
必须允许下面列出的大多数变量的长度根据管道中的先前步骤而改变。列出的尺寸取自 1 个示例,以显示相对大小。
s.ids = 一个长度为 66510 的因子。没有注意到更改为字符向量时的速度差异。
g.list = 长度为 978 的字符向量。
l_signatures = 978x66511 矩阵。
d_g_up 和 d_g_down = 带有与 g.list 相关元数据的小数据帧(nx10,n 范围为 5-200)
c_score_new() 计算分数。它足够复杂,在这种情况下它基本上是不可改变的。它期望e_signature 有 2 列,其中 1 列由 g.list(“ids”)组成,另一列是由 rank(-1 * l_signatures[,as.character(id)], ties.method="random") 生成的相应“等级”
for (id in s.ids) {
e_signature <- data.frame(g.list,
rank(-1 * l_signatures[, as.character(id)],
ties.method="random"))
colnames(e_signature) <- c("ids","rank")
d_scores <- c(d_scores, c_score_new(d_g_up$Symbol, d_g_down$Symbol, e_signature))
}
总计,这需要 5-10 分钟来计算,其中 3-5 分钟归因于 e_signature 的生成,这在计算上并不复杂。这就是我怀疑优化可能带来最大好处的地方。
如果我们在执行c_score_new() 之前执行循环以更有效的方式生成e_signature 并将结果合并为1 个对象(978x66510),它可能会更快?
我无法确定细节,而且我不相信这是最好的方法。所以在我追逐这只野鹅之前,我认为社区可能能够引导我朝着最好的方向前进。
【问题讨论】:
标签: r performance for-loop optimization apply