全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
4794 8
2016-02-25
既然for循环、apply速度都远不如向量化计算,那么如何去自定义向量化计算,而不是仅仅限制在R中已有的函数?
二维码

扫码加我 拉你入群

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

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

全部回复
2016-2-25 22:22:38
感觉是一个很大的方向性问题,能结合实例吗?
二维码

扫码加我 拉你入群

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

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

2016-2-25 22:49:59
cheetahfly 发表于 2016-2-25 22:22
感觉是一个很大的方向性问题,能结合实例吗?
谢谢,就是一个比较宽泛的问题。
举一个例子:
data <- data.frame(V1=1:10,V2=2:11)
如果想要对每行求和,向量化的函数就是rowSums(data),循环就是apply(data,1,sum)

那么如果想对每一行进行更复杂的操作,例如求平方和,循环来做就是
f <- function(x) sum(x^2); apply(data,1,f)
向量化计算如何来做?
二维码

扫码加我 拉你入群

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

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

2016-2-25 23:36:12
万人往LVR 发表于 2016-2-25 22:49
谢谢,就是一个比较宽泛的问题。
举一个例子:
data
在这个特定的例子中,还算比较好解决的,
rowSums(as.matrix(data)^2)

不过,我猜测你想表达是当某些循环非常难以被向量化时,有什么普遍的原则或特别的技巧能够突破瓶颈,尽最大可能地向量化。

我的观点是,向量化的本质是让程序尽可能地靠近“底层”执行,就是C语言代码。当遇到某些瓶颈,就如大神“Hadley Wickham”在《advanced R》中所提到的“Loops that can’t be easily vectorised because subsequent iterations depend on previous ones”。当这个时候,应该果断转向Rcpp包所开创的新天地:C++编程——至少针对核心循环的简单编程并不难。

有了“向量化”和“Rcpp包”后,我感觉基本上R语言在计算效率上就已经不存在编程语言上的瓶颈,只存在编程经验上的瓶颈了。
二维码

扫码加我 拉你入群

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

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

2016-2-26 12:41:21
cheetahfly 发表于 2016-2-25 23:36
在这个特定的例子中,还算比较好解决的,
rowSums(as.matrix(data)^2)
感谢,感觉打开了新世界大门,不过不太了解C++的循环机制,所以还有几个疑问:
1. 调用C++后仅仅写一个for循环就会达到R中向量化计算的速度了吗?
2. 有人说向量化计算速度快是因为并行化计算,那么调用C++写循环会自动并行化运算吗?
3. 有人说apply系列函数也是向量化的函数,但是又有人测试说apply循环速度与for循环速度差不多,因为循环占用的时间大部分来源于copy数据框。您如何理解?

谢谢!
二维码

扫码加我 拉你入群

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

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

2016-2-26 14:02:01
万人往LVR 发表于 2016-2-26 12:41
感谢,感觉打开了新世界大门,不过不太了解C++的循环机制,所以还有几个疑问:
1. 调用C++后仅仅写一个f ...
对于第一个问题,确实如此,用C++写的优化后的循环(不考虑C和C++的细微差别),应该只快不慢于最极致的向量化之后的效果。对此,你可以参考一个帖子:《【R】提升R代码运算效率的11个实用方法》(https://bbs.pinggu.org/thread-4405601-1-1.html),仔细看原版的英文贴。

对于第二个问题,恕我不同意该观点,我目前看到的资料,得出的结论是向量化之所以效率高,是因为应用了R语言的底层函数,减少“解释语言”的效率浪费。至于并行化,那是另外一个方向,另外一个天地了,我们现在零星接触的单CPU多核多线程并行化实在最基础最简单的一种,复杂的诸如利用GPU并行,利用局域网、互联网并行,超级计算机并行等,里面博大精深得很。在R语言层面上,其实你会发现向量化和并行化有时不一定能同时优化,但在C++上就没有这样的矛盾了。C++我了解的很浅,应该不是天然并行化运算的,也要在编程时刻意去设计。

对于第三个问题,我一直觉得apply是隐性的循环,适合从其他语言转过来的人过渡使用,可以增加编程的效率和代码的可读性,但并不是最优的,不光apply(),包括mapply(),sweep()等。如果对R熟练到一定程度,apply族肯定不是优化的终点,同样的函数包括ifelse()等。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群