楼主: xupengswordsman
8078 11

[程序分享] apply函数有利于提升R运算速度吗?以高维度数组为例 [推广有奖]

  • 6关注
  • 16粉丝

教授

45%

还不是VIP/贵宾

-

威望
0
论坛币
4817 个
通用积分
48.6123
学术水平
36 点
热心指数
48 点
信用等级
26 点
经验
106305 点
帖子
1021
精华
0
在线时间
1518 小时
注册时间
2007-12-30
最后登录
2024-1-20

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
最近学习面板数据的蒙特卡洛模拟编程。编程过程中,涉及大量高维度数组,比较抽象,当时有些崩溃,不过还是挺过来,终于再一次理解绝地逢生这一句成语了。我的解决方法比较笨,但是比较实在。自己先用符号运算跑了一遍,结果证明正确,我才开始安安心心写R程序(又是一页辛酸史,一把鼻涕,一把泪,有空开个贴,好好和大家聊聊高维数组的符号运算)。当时,在论坛上逛,看了些初级书,许多人都说apply函数是个好东西,于是我就开始迷恋上了她了!现在想想,对象没有选对,害了自己几夜没睡好觉,端午放假,得补觉去喽!然而实战中,当时我还没有发现她的弊端,食堂午饭时间,还像别人大肆宣传她的好处,哎,现在希望那些人在我说话时开小车,不然太内疚了。
       我和师弟,关于我的程序讨论了一个晚上,程序不长也不短,差不多400行吧(当然也包括多条注释,嘿嘿),我们达成一个共识,程序没错,但就找不出运算缓慢的原因。当天晚上,回宿舍,又开始狂逛论坛,结果很明显,还是一无所获。不知道是什么原因,凌晨干活异常清醒,我经常在这个时候想到比较好的解决方法,当然在一些大牛看来有些笨啦。于是我就利用system.time()函数一条一条测试程序运行时间,突然间发现apply函数即是原因所在,它就像绝大多数外围女,外观美丽,肚子里装的全是水(当然草也是备选啦,任凭你怎么想了),运算速度确实不敢恭维,特别是在我的数值优化中,一次迭代就要花去我两次上厕所的时间,没有夸张,事实就是如此。当时,我很快想到爱恨交织的for循环,没想到,她却我给我一个大大惊喜,速度能甩apply函数几条大街。哇咔咔,安心睡大觉啦!
       高兴归高兴,但是我还是不想让她抛头露面,呵呵,躺在床上想了想。于是,今早,师兄答辩之时(当然是干完我的分内之事啦),又开始在论坛狂轰乱炸,这次结果显而易见,idea有了。colSums、colMeans、rowSums和rowMeans函数。为什么是这些函数了?论坛一些大牛指出这些函数是通过底层语言、c++和fortran编写的,运算速度较快,而apply函数是通过R自身的for循环构建的,对数值运算速度提升没啥帮助。很遗憾,本科我只学过VB和SAS,对底层语言一无所知,记忆中大二暑期帮同学借过一本C++,结果超期,罚了我30元,六顿盐水鸭的钱啊。言归正传,接下来说说我对col*,row*函数的运算时间测试,结果验证了大牛们的结论,她确实是最棒滴,此时我如释重负,终于找到一条最优路径,到达罗马城了。
      今天废话太多了,不多说了,直接上程序,让大家品味下!对了,关于col*,row*函数的介绍,我写了一个比较粗糙的帖子,大家如果不介意,可以小逛下。链接地址:https://bbs.pinggu.org/thread-3071374-1-1.html


  1. > #首先生成一个2x15x6x100x100数组
  2. > x<-array(1:(1800000),c(2,15,6,100,100))
  3. > #利用三种方法,对该数组第一维度求和
  4. > #for循环
  5. > system.time({y<-0;for(i in 1:2) y<-y+x[i,,,,]})
  6. 用户 系统 流逝
  7. 0.10 0.00 0.09
  8. > #apply函数
  9. > system.time(y1<-apply(x,c(2,3,4,5),sum))
  10. 用户 系统 流逝
  11. 7.42 0.00 7.70
  12. > #colSums函数
  13. > system.time(y2<-colSums(x,dims=1))
  14. 用户 系统 流逝
  15.    0    0    0
  16. > #验证y、y1、y2是否相等
  17. > all.equal(y,y1)
  18. [1] TRUE
  19. > all.equal(y,y2)
  20. [1] TRUE
复制代码

       哈哈,看到row*,col*函数威力了吗?显而易见吧,希望此帖能给大家编程,带来速度的大幅度提升(这里就不打火箭了)。呵呵,毕竟在论坛上折腾了几个星期了,不提升也不行哈!


     接下来,我会写一个关于加速R矩阵运算的帖子,OpenBLAS,到时欢迎大家关注,一起交流学习。




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:apply函数 apply 运算速度 appl App 蒙特卡洛 程序

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
李会超 + 60 + 20 精彩帖子
jiangbeilu + 20 + 2 + 2 + 2 精彩帖子
famousid + 1 + 1 + 1 好东西大家一起分享,谢谢啦

总评分: 经验 + 60  论坛币 + 40  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

xupeng
沙发
zippo414 发表于 2014-5-31 22:17:04 |只看作者 |坛友微信交流群
牛逼啊师兄。

使用道具

藤椅
xupengswordsman 发表于 2014-5-31 22:32:46 |只看作者 |坛友微信交流群
zippo414 发表于 2014-5-31 22:17
牛逼啊师兄。
没啥 一些感想!你比我牛
xupeng

使用道具

不错。厉害。
知者不言,言者不知

使用道具

报纸
chxq03 在职认证  发表于 2014-6-2 10:24:52 |只看作者 |坛友微信交流群
system.time确实是个好东东,蒙特卡洛模拟的时候全靠他了。colSums、colMeans、rowSums和rowMeans函数确实不错。不过,apply有你说的那么挫吗?我也是经常听说这玩意儿超强大啊
已有 1 人评分论坛币 学术水平 收起 理由
jiangbeilu + 10 + 2 鼓励积极发帖讨论

总评分: 论坛币 + 10  学术水平 + 2   查看全部评分

使用道具

地板
chxq03 在职认证  发表于 2014-6-2 10:27:49 |只看作者 |坛友微信交流群
楼主贬低apply就算了,干嘛连失足女、外围女一块骂了,她们招你惹你了?她们也有人权。哈哈

使用道具

7
xupengswordsman 发表于 2014-6-2 10:41:17 |只看作者 |坛友微信交流群
chxq03 发表于 2014-6-2 10:24
system.time确实是个好东东,蒙特卡洛模拟的时候全靠他了。colSums、colMeans、rowSums和rowMeans函数确实不 ...
首先谢谢你看的仔细!其实,我也迷恋过她,不是说她不好!不过在一般运算中,她的威力还是很大的,毕竟简洁美观嘛!但是在我这个运算中,apply函数确实让我尝到了许多苦头。之前用apply函数编的那个程序,数值优化要2030秒,但现在用colSums和rowSums函数只要90秒了。火箭般速度的提升啊,不得好好夸夸colSums和rowSums啦!另外声明下,我接触R,编程不久,里面许多函数还不太清楚,有啥不妥处,忘楼主提供宝贵建议!
xupeng

使用道具

8
xupengswordsman 发表于 2014-6-2 10:43:21 |只看作者 |坛友微信交流群
chxq03 发表于 2014-6-2 10:27
楼主贬低apply就算了,干嘛连失足女、外围女一块骂了,她们招你惹你了?她们也有人权。哈哈
关键是她们太高调了,把海波同志弄到局子里了,还6个月考察期。我替海波鸣不平,海波不黄!
xupeng

使用道具

9
xupengswordsman 发表于 2014-6-2 10:44:47 |只看作者 |坛友微信交流群
chxq03 发表于 2014-6-2 10:27
楼主贬低apply就算了,干嘛连失足女、外围女一块骂了,她们招你惹你了?她们也有人权。哈哈
哎 发个搞笑帖子 还要审核!海波情何以堪?
xupeng

使用道具

10
tzj110 发表于 2016-2-25 10:47:53 |只看作者 |坛友微信交流群
对初学者太有价值了,感谢楼主!!!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-5 16:40