【发布时间】:2017-10-16 13:10:32
【问题描述】:
我有以下使用sapply 的sample 代码需要很长时间来处理(因为执行了很多次):
samples = sapply(rowIndices, function(idx){
sample(vectorToDrawFrom, 1, TRUE, weights[idx, ])
})
问题是我必须从矩阵中的权重中提取,这取决于rowIndices 中的索引。
是否有人有更好的想法从矩阵的行中绘制?
可重现的例子:
rowIndices = floor(runif(1000, 1, 100))
vectorToDrawFrom = runif(5000, 0.0, 2.0)
weights = matrix(runif(100 * 5000, 1, 10), nrow = 100, ncol = 5000)
timer = 0
for (i in 1:2500){
ptm = proc.time()
samples = sapply(rowIndices, function(idx){
sample(vectorToDrawFrom, 1, TRUE, weights[idx, ])
})
timer = timer + (proc.time() - ptm)[3]
}
print(timer) # too long!!
【问题讨论】:
-
sapply真的是瓶颈吗?我对此表示怀疑。 -
是的,因为它被执行了数千次。
-
查看我更新的问题
-
我的意思是 你的 sapply 里面的东西 可能是瓶颈。不使用
sapply本身。如果你不能加快随机抽样(或者你实际代码中的任何东西),你就是在浪费你的时间。 -
加快
sample的一种方法是调用一次并绘制n次。我的意思是rowIndices平均被复制了 10 倍。不要为同一行索引调用sample10 次,而是调用 sample 一次并绘制 10 个值(或者您需要的任意多个值)。这使我的测试速度提高了 5 倍