继之前帮站长debug之后,站长发了第三段代码给我,我跑了一下,一切顺利,不得不感慨站长的R语言水平真是日渐高涨呀。
【画图】与SARS-CoV-2病毒结合ACE2基因表达正相关的LncRNA有哪些?
唯一需要改进的地方就是速度太慢了,因为做相关性分析,要计算6万多次相关系数,居然要花了547秒,接近10分钟的时候才计算完毕,时间就是金钱,有没有办法提高R程序的运行效率呢?
网上有很多大神提供了许多建议和方案,包括 Hadley Wickham在其《Advance R》里第最后一章也专门论述了如何提高R的运行效率,今天我们就以站长的这段代码为例,来评测一下各种方法的运行效率。本文中所有的计算都在配置了2.6GHz 双核CPU和8GB DDR3内存的MAC OS X中运行。
其实我们知道在R里面最能提升效率的一个方法就是少用For循环,多用apply,因为R是面向数组的语言,apply面向数组遍历,效率自然要高上十倍还多。这个很容易验证,好奇的同学请务必自行验证。
站长这里用的lapply函数自然是极好的,特别适合遍历list元素,因为事前把lungTMP这个表的rowname装到了list里面,用lapply(相当于list+apply)来遍历,真的值得大家都来学习,能够灵活运用apply函数绝对是R语言进阶必备。
既然循环没有问题,那我猜会不会是cor.test这个函数计算花费的时间太长了。Hadley大神在Advance R里面建议可以用编译函数或外挂C语言脚本来提升函数的效率,那么我们先来试试用编译函数的效果。
# 尝试编译函数提高函数效率
library(compiler)
cor.test_c <- cmpfun(cor.test)
# 用编译的函数来执行运算
dd <- cor.test_c(as.numeric(data[x,]),y, type=“spearman")
可以看到结果并不理想,甚至比原来还要慢100多秒,看来这个方法可能不太适合我们这种情况。
Hadley大神最推崇的方法是把函数用C/C++语言重写之后,在R里面调用执行。具体方法是 先用C语言写好函数脚本,比如保存为myfunction.cpp,然后在R里面加载Rcpp包调用即可。比如:
library(Rcpp)
sourceCpp(“myfunction.cpp”)
system.time(output<- myFun(var) ) #具体见Rcpp帮助
虽然有很多同学不会C语言,但没关系,我们生在了一个非常好也非常坏的时代,好在几乎你能想到的事情都已经有人做过了,坏也坏在你的idea几乎别人都做过了。像用C语言写个相关性计算的cpp程序99.9%的可能在github上有的。果然,动动小手就找到了,而且比cpp脚本还要好,作者已经打包上传到CRAN了,叫wCorr。作者用调用Cpp的方式来完成相关性计算,也就是说,你只需要调用这个包里的函数wCorr::weightedCorr就可以了。
为了单纯验证wCorr和cor.test的执行效率,我单独把两个函数拿出来只做计算用,因为这样不涉及data.frame操作所耗时间,可比性更强一点,代码如下,首先是R base里cor.test函数的运行结果:
这是用wCorr的结果:
可以看到wCorr包的函数确实比cor.test快了那么20多秒,说明在计算相关系数方面,可能并不是整个函数耗时最多的部分。
既然计算相关性耗时不是决定性因素,有没有可能是因为数据结构的问题,因为最典型的例子就是read.csv和fread的读写文件的巨大差异:
由于data.table被誉为神包,在数据索引上的效率远远高于dataframe,因此我们继续尝试直接把lung.csv读取为data.table,然后直接用函数操作,
结果如下:
可以看到有一定效果,但不是很明显,仅仅提升了100秒左右的速度,还是不尽如人意。
经过上面的尝试之后,我们体会到pathway.score这个函数包含数据索引,计算,递归,循环,建表等诸多操作,因此单独使用一种方法可能对总体速度提高不是很明显,因此最好是能同时计算(lungTMP有60498行,意味着需要执行这个函数6万多次),利用CPU的多线程特性,节约计算时间。
好消息是万能的R提供了现成的并行计算包,能够轻松实现多线程计算。我们来看看代码:
结果如下:
看到这个结果还比较让人满意,总耗时380秒左右,较原来的方法缩短了160秒,相当于提高了30%的效率。
但比较遗憾的是调用parallel包的时候不能同时使用data.table数据结构,因为data.table也是多线程的,它其实也是通过调用parallel::mclapply和foreach包里的函数实现快速处理,因此parallel和data.table只能二选一。
好了,通过以上的实测比较,我们了解到在R里面解决一个问题可以有很多不同的方法和策略,不同的方式结果可能结果相同但效率却千差万别,或许这就是R语言让新手容易感到困惑的地方,一旦经历一个学习曲线之后,这也是R让人着迷的地方。
素材:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有