Re: [問題] list 元素加總,如何不用loop做到
我可以demo一個簡單的效率比較
code: https://pastebin.com/5mV0d8ZN
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去做: do.call(.Primitive("+"), mat.list)
三、化做三維陣列去做也可以,只是用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
推
01/18 01:20, , 1F
01/18 01:20, 1F
→
01/18 09:17, , 2F
01/18 09:17, 2F
推
01/18 11:34, , 3F
01/18 11:34, 3F
推
01/21 20:29, , 4F
01/21 20:29, 4F
※ 編輯: celestialgod (219.70.162.88 臺灣), 12/06/2019 21:46:45
※ 編輯: celestialgod (219.70.162.88 臺灣), 12/06/2019 21:59:10
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章