我的代碼時,無名(變得命名)向量創下了性能障礙,我可以重現這個片段很慢分配中的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