我的代码时,无名(变得命名)向量创下了性能障碍,我可以重现这个片段很慢分配中的R
rm (z)
z = c()
system.time({z[as.character(1:10^5)] = T})
user system elapsed
48.716 0.023 48.738
我试着用
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)和以不同的方式对其进行初始化,但即使是更改名称回到别的东西上,把时间倒回慢。 我在说这不是一种解决方法,因为我不明白它为什么起作用,所以很难将其推广到事先不知道名称的实际用例。当然,考虑到两个数量级的差异,人们怀疑涉及到一些非矢量化或解释器繁重的操作,但是您可以看到我的代码是无循环的,并且不会调用任何我能想到的解释代码。然后尝试使用更小的向量,我发现执行时间比线性可能快得多,也许是指向其他方面的二次方。问题是这种速度行为的原因是什么,以及使速度更快的解决方案是什么。
平台是OS X mt狮子与R 15.2。由于
安东尼
我没有去找出涉及的源代码,但是其他实验支持这种解释。幸运的是,我发现了一种不需要命名向量的不同方法。 – piccolbo