作者celestialgod (攸蓝)
看板R_Language
标题Re: [问题] list 元素加总,如何不用loop做到
时间Sat Jan 17 23:36:25 2015
我可以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:
[email protected] 16G ram windows 7 64bit R-3.1.2
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 223.138.148.4
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1421508987.A.88C.html
※ 编辑: celestialgod (223.138.148.4), 01/17/2015 23:58:42
1F:推 memphis: 所以上一题的正解还是 Reduce('+', mat.list) ? 01/18 01:20
2F:→ celestialgod: 结论来说,是的。 01/18 09:17
3F:推 HeroNoah: 程式 + 说明, 好文章, 推. 01/18 11:34
4F:推 a78998042a: 感谢板主!推 01/21 20:29
※ 编辑: celestialgod (219.70.162.88 台湾), 12/06/2019 21:46:45
※ 编辑: celestialgod (219.70.162.88 台湾), 12/06/2019 21:59:10