提升R代碼運(yùn)行速度并不需要很高級(jí)的優(yōu)化技術(shù), 例如代碼并行化, 使用數(shù)據(jù)庫(kù), 使用c++等. 實(shí)際上, 通過(guò)簡(jiǎn)單的操作, 就能夠是R的運(yùn)算速度顯著的加快, 下面介紹幾種方法. 1, 向量化R語(yǔ)言允許用戶進(jìn)行向量化編程, 這樣速度更快. 比如我們計(jì)算100萬(wàn)隨機(jī)數(shù), 計(jì)算他們的平方, 這里使用兩種方法: 第一種, for循環(huán); 第二種, 向量化 set.seed(123) for循環(huán)system.time({ user system elapsed 直接在原向量上計(jì)算平方system.time({ user system elapsed head(dat);head(dd2) 速度由0.3s到0.02s 2, 預(yù)分配內(nèi)存R語(yǔ)言是動(dòng)態(tài)分布內(nèi)存的, 不需要預(yù)先定義變量, 可以直接使用. 這種方法比較簡(jiǎn)單, 但是數(shù)據(jù)量大時(shí), 會(huì)影響速度. 所以在使用變量時(shí), 提前聲明變量的大小, 會(huì)提升速度 不預(yù)先分布內(nèi)存這個(gè)程序, 不知道dat的長(zhǎng)度是多少, 因此是動(dòng)態(tài)的內(nèi)存結(jié)構(gòu). N = 1e5;N 1e+05 system.time({ user system elapsed 預(yù)先分配內(nèi)存dat的長(zhǎng)度是1e5, 因此我們可以生成這一個(gè)為0的向量, 這樣他的內(nèi)存就固定了 N = 1e4;N 10000 system.time({ user system elapsed 可以看到, 時(shí)間由7.5s降到0.11s 3, 使用apply函數(shù)代替for循環(huán)apply函數(shù)及其變種:
如果各個(gè)迭代之間相互獨(dú)立, 那么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在矩陣運(yùn)算時(shí), 盡量轉(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
|
|
來(lái)自: 育種數(shù)據(jù)分析 > 《待分類》