|
提升R代碼運行速度并不需要很高級的優(yōu)化技術(shù), 例如代碼并行化, 使用數(shù)據(jù)庫, 使用c++等. 實際上, 通過簡單的操作, 就能夠是R的運算速度顯著的加快, 下面介紹幾種方法. 1, 向量化R語言允許用戶進行向量化編程, 這樣速度更快. 比如我們計算100萬隨機數(shù), 計算他們的平方, 這里使用兩種方法: 第一種, for循環(huán); 第二種, 向量化 set.seed(123)for循環(huán)system.time({ user system elapsed 直接在原向量上計算平方system.time({ user system elapsed head(dat);head(dd2)速度由0.3s到0.02s 2, 預(yù)分配內(nèi)存R語言是動態(tài)分布內(nèi)存的, 不需要預(yù)先定義變量, 可以直接使用. 這種方法比較簡單, 但是數(shù)據(jù)量大時, 會影響速度. 所以在使用變量時, 提前聲明變量的大小, 會提升速度 不預(yù)先分布內(nèi)存這個程序, 不知道dat的長度是多少, 因此是動態(tài)的內(nèi)存結(jié)構(gòu). N = 1e5;N1e+05 system.time({ user system elapsed 預(yù)先分配內(nèi)存dat的長度是1e5, 因此我們可以生成這一個為0的向量, 這樣他的內(nèi)存就固定了 N = 1e4;N10000 system.time({ user system elapsed 可以看到, 時間由7.5s降到0.11s 3, 使用apply函數(shù)代替for循環(huán)apply函數(shù)及其變種:
如果各個迭代之間相互獨立, 那么apply函數(shù)是可以代替for循環(huán)的 for循環(huán)set.seed(123)system.time({ user system elapsed square = function(x){ return(x^2)system.time({tt = lapply(dat, FUN=square)}) user system elapsed t = rep(0,length(dat))system.time({t = lapply(dat, FUN=square)}) user system elapsed 4, 使用matrix而不是data.table在矩陣運算時, 盡量轉(zhuǎn)化為matrix格式 使用matrixdat = matrix(rnorm(1e4*1000),1e4,1000)dd = as.data.frame(dat) user system elapsed 使用data.frmaesystem.time( rowSums(dat)) user system elapsed
|
|
|