作者celestialgod (攸藍)
看板R_Language
標題Re: [問題] list 元素加總,如何不用loop做到
時間Sat Jan 17 23:36:25 2015
我可以demo一個簡單的效率比較
code:
http://pastebin.com/KCNEcvMi
Reduce是除了用rcpp外最快的,無話可說
但是Reduce有一個重大缺點 需要較多的RAM才可以運行
因此,當你的matrix大小越大或是list長度越長 (資料越多)
就會無法使用,這時候就要找替代方案
最簡單的方式就是直接用迴圈做,穩又比除了Reduce跟Rcpp之方法快
至於版友提到先轉向量,然後做rbind or cbind後做和,再轉回原維度
因為reshape動作過多,影響效率,個人並不推薦
最快又最省記憶體的方式便是透過RcppArmadillo (RcppEigen也可)
(RcppEigen在windows裡預設的BLAS比RcppArmadillo快,因此效率會更好)
在我的例子中,跟Reduce可以差到2.4倍
但是當list長度增加或是matrix大小增加時,Reduce就會慢下來 (這可以自行測試)
至於迴圈就穩定維持在差距2.9倍左右
補充:
一、因為要把list中的矩陣都相加,所以openmp並不會改善多少效率
(利用#pragma omp atomic,不確定有沒有其他方案可以使用),
這裡就沒有去寫相關的程式碼了
二、直接使用do.call去做,我還沒有找到方法,抱歉。
三、化做三維陣列去做也可以,只是用apply(mat.array, 1:2, sum)
必定比直接用Reduce慢。
另外,我認為list是R比較方便輸出的資料格式,把程式設計使用於三維陣列比較不方便
四、Machine: i7-4770K@4.2GHz 16G ram windows 7 64bit R-3.1.2
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.138.148.4
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1421508987.A.88C.html
※ 編輯: celestialgod (223.138.148.4), 01/17/2015 23:58:42
推 memphis: 所以上一題的正解還是 Reduce('+', mat.list) ? 01/18 01:20
→ celestialgod: 結論來說,是的。 01/18 09:17
推 HeroNoah: 程式 + 說明, 好文章, 推. 01/18 11:34