我的代码遇到了性能障碍,我可以在这个片段中重现
rm (z)
z = c()
system.time({z[as.character(1:10^5)] = T})
user system elapsed
48.716 0.023 48.738
我试图预先分配 z
z = logical(10^5)
但这没有什么区别。然后我预先分配了名称
names(z) = character(10^5)
仍然没有速度差异。
system.time({z[as.character(1:10^5)] = T})
user system elapsed
50.345 0.035 50.381
如果我重复测试,无论有没有预分配,速度都会回到合理的水平(快 100 倍以上)。
system.time({z[as.character(1:10^5)] = T})
user system elapsed
0.037 0.001 0.039
最后我找到了一个不太好的解决方法:
names(z) = as.character(1:10^5)
system.time({z[as.character(1:10^5)] = T})
user system elapsed
0.035 0.001 0.035
要回到慢速时间,您可以 rm(z) 并以不同的方式对其进行初始化,但即使将名称改回其他名称也会使时间变慢。我说这不是一种解决方法,因为我不明白它为什么起作用,所以很难概括到我事先不知道名称的实际用例。当然,考虑到这两个数量级的差异,人们怀疑其中涉及一些非矢量化或解释器繁重的操作,但您可以看到我的代码是无循环的,并且不会调用我能想到的任何解释代码。然后尝试使用较小的向量,我发现执行时间比线性增长快得多,也许是二次的,这指向了别的东西。问题是这种速度行为的原因是什么以及使它更快的解决方案是什么。
平台是带有 R 15.2 的 OS X mt lion。谢谢
安东尼奥