2016年4月14日 星期四

R 語言優缺點與效能改善方法 apply、Rcpp

 

寫了一年R,來歸納一下寫R的心得~ R是一門用於統計計算的語言,簡言之,R的優點是統計學家的優點,缺點也是統計學家的缺點XDD






一、R語言的優缺點


1. 優點


  • 開源免費:最大的優勢,免錢啦!! 我一開始把他當免費版的matlabXD
  • 小而巧:R核心大概50mb左右而已,討厭肥大的軟體~
  • 兼容性好:我的電腦linux, mac, windows都有灌R,很方便!
  • 無敵多的package:在R的綜合檔案網絡CRAN中提供6000多的package,感覺自己都沒在寫程式,大部分時間都在看package文檔,文檔又寫得很清楚,直接用別人的智慧結晶XD
  • 統計、數據分析、機器學習、文本探勘、繪圖:這幾個領域的package尤其豐富,做這些事用R就對了~ 
  • IDE好用:Rstudio真的很讚,沒看過設計這麼好的IDE:)

2. 缺點


  • 醜陋的語言:賦值是"<-",初始值是"1"... 語法隨便都可以過,不好抓bug,其實很不符合 "programmer的品味" ..XD
  • 效率很糟:萬不得已不要寫for迴圈,還有很多計算速度的陷阱,令人不敢恭維。
  • 數據量限制:記憶體管理和平行處理很糟糕,影響到R可以處理的數據規模,通常300mb以上的檔案就要考慮一下R的效率了,硬要優化速度的開發時間倒不如直接寫C比較快..XD
  • 部分package不穩定、有版本問題:這算是開源的原罪,尤其處理中文時很容易遇到問題。





二、R語言改善效率的方法



1. apply系列函數 : apply()、*apply()


在R的世界裡寫程式要有向量的思維,在R裡執行單行命令要比用loop快很多,因此當我們需要對矩陣的行或者列逐一計算時,apply()系列函數會提高大量效率。


apply(資料集名稱, 2逐行/1逐列, 套用的函數)


apply()本質上仍然是loop,但它比直接用for要快很多,而且可以簡化程式碼,提升可讀性。



2. R遇上c++ : Rcpp library


現在有了 Rcpp library ,要寫低階語言接到 R 比以前容易很多^^

下面是一個小範例 (優化tf-idf賦值) ,做二維陣列的賦值:


R for loop 版


for(i in 1:nrow(tdm)){
  for(j in 1:ncol(tdm)){
    MinR[i,j] <- (MinR[i,j] / tf[j]) * idf[i]
  }
}


c++ 版


cppFunction('
            NumericMatrix MatrixTFIDF(NumericMatrix x, NumericVector tf,  NumericVector idf ) {
            int nrow = x.nrow(), ncol = x.ncol();
              for (int i = 0; i < nrow; i++) {
                for (int j = 0; j < ncol; j++) {
                  x(i, j) = (x(i, j)/tf(j)) * idf(i);
                }
              }
              return x;
            }
            ')
MinCpp <- MatrixTFIDF(MinCpp, c(tf), c(idf))


兩者都做10次計算,取平均速度做比較:


options(scipen=100)
c(mean(time.r),mean(time.cpp))
barplot(c(mean(time.cpp),mean(time.r)),
        names.arg=c("C++","R"), cex.names = 1.5,
        ylab="sec",
        col = c("lightblue", "mistyrose"),
        main = "Matrix Computing Time (TF-IDF) in C++ and R"
        )


速度真是天壤之別啊!!





三、我為什麼喜歡寫R 



我喜歡寫c++勝過java,即使我知道java設計比較「優雅」

我喜歡寫R勝過python,即使我知道python設計比較「簡單」

有時候喜歡一個程式語言不需要理由,理由都是事後穿鑿附會上去的..XD

不過真的要說的話..

R is an amazing software interface into the best algorithms : )




References


也談提高R語言的運算效率
http://cos.name/2009/12/improve-r-computation-efficiency/







技術提供:Blogger.