前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【测评】提高R运行效率的若干方法

【测评】提高R运行效率的若干方法

作者头像
Chris生命科学小站
发布于 2023-02-28 10:54:26
发布于 2023-02-28 10:54:26
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

继之前帮站长debug之后,站长发了第三段代码给我,我跑了一下,一切顺利,不得不感慨站长的R语言水平真是日渐高涨呀。

【画图】与SARS-CoV-2病毒结合ACE2基因表达正相关的LncRNA有哪些?

唯一需要改进的地方就是速度太慢了,因为做相关性分析,要计算6万多次相关系数,居然要花了547秒,接近10分钟的时候才计算完毕,时间就是金钱,有没有办法提高R程序的运行效率呢?

网上有很多大神提供了许多建议和方案,包括 Hadley Wickham在其《Advance R》里第最后一章也专门论述了如何提高R的运行效率,今天我们就以站长的这段代码为例,来评测一下各种方法的运行效率。本文中所有的计算都在配置了2.6GHz 双核CPU和8GB DDR3内存的MAC OS X中运行。

首先,我们看看最花费时间的这段函数:

第一招:用apply函数代替For循环

其实我们知道在R里面最能提升效率的一个方法就是少用For循环,多用apply,因为R是面向数组的语言,apply面向数组遍历,效率自然要高上十倍还多。这个很容易验证,好奇的同学请务必自行验证。

站长这里用的lapply函数自然是极好的,特别适合遍历list元素,因为事前把lungTMP这个表的rowname装到了list里面,用lapply(相当于list+apply)来遍历,真的值得大家都来学习,能够灵活运用apply函数绝对是R语言进阶必备。

第二招:利用函数编译提高效率

既然循环没有问题,那我猜会不会是cor.test这个函数计算花费的时间太长了。Hadley大神在Advance R里面建议可以用编译函数或外挂C语言脚本来提升函数的效率,那么我们先来试试用编译函数的效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 尝试编译函数提高函数效率
library(compiler)
cor.test_c <- cmpfun(cor.test)
# 用编译的函数来执行运算
dd  <- cor.test_c(as.numeric(data[x,]),y, type=“spearman")

可以看到结果并不理想,甚至比原来还要慢100多秒,看来这个方法可能不太适合我们这种情况。

第三招:利用C语言脚本执行函数

Hadley大神最推崇的方法是把函数用C/C++语言重写之后,在R里面调用执行。具体方法是 先用C语言写好函数脚本,比如保存为myfunction.cpp,然后在R里面加载Rcpp包调用即可。比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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多秒,说明在计算相关系数方面,可能并不是整个函数耗时最多的部分。

第四招:利用data.table数据结构

既然计算相关性耗时不是决定性因素,有没有可能是因为数据结构的问题,因为最典型的例子就是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让人着迷的地方。

素材:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Chris生命科学小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
R语言性能Tips和GC
最近团队在使用R语言作为算法的实践语言,通过人工策略和xgboost算法进行一些价格算法的控制和输出,发现一些代码中对于内存、CPU、程序设计思想以及现代统计算法并不是很熟悉,于是特写此篇普及一下知识,也算是我对R语言的入门文章吧。
吕海峰
2018/08/08
1.8K0
R语言性能Tips和GC
提升R代码运算效率的11个实用方法——并行、效率
转载于36大数据,原文作者:Selva Prabhakaran 译者:fibears
悟乙己
2019/05/26
1.1K0
For循环与向量化(Vectorization)
感谢水友们积极的提问,大猫和村长在此再次表示衷心的感谢。通过对水友们问题的汇总,我们发现大多数水友存在一些R语言的应用误区,在此出一期关于该问题的解读。
用户7652506
2022/04/14
1.9K0
提升R代码运算效率的11个实用方法
众所周知,当我们利用R语言处理大型数据集时,for循环语句的运算效率非常低。有许多种方法可以提升你的代码运算效率,但或许你更想了解运算效率能得到多大的提升。本文将介绍几种适用于大数据领域的方法,包括简
CDA数据分析师
2018/02/24
1.7K0
提升R代码运算效率的11个实用方法
左手用R右手Python系列11——相关性分析
由于最近毕业论文缠身,一直都没有太多时间和精力撰写长篇的干货,但是呢学习的的脚步不能停止,今天跟大家盘点一下R语言与Python中到的相关性分析部分的常用函数。 常用的衡量随机变量相关性的方法主要有三种: pearson相关系数;即皮尔逊相关系数,用于横向两个连续性随机变量间的相关系数。 spearman相关系数;即斯皮尔曼相关系数,用于衡量分类定序变量间的相关程度。 kendall相关系数;即肯德尔相关系数,也是一种秩相关系数,不过它所计算的对象是分类变量。 R语言: cor cor.test corrp
数据小磨坊
2018/04/11
1.9K0
左手用R右手Python系列11——相关性分析
R语言与独孤九剑以及Python与降龙十八掌
R语言可以比作独孤九剑, 函数都是写好的, 包也是写好的, 直接用就可以了, 功能强大. 就像独孤九剑, 学起来不需要任何基础, 学会之后很强大, 破刀式, 破剑式, 破枪式等等, 可以应对很多问题. 但是如果你想在此基础上更上一层楼, 就难于登天了, 因为你没有基础, 向上走一点, 真的是牵一发而动全身, 进入了编程能力的天花板.
邓飞
2019/06/13
9610
【学习】【R语言读书会】《R实战》读书笔记(第七章)
读书会是一种在于拓展视野、宏观思维、知识交流、提升生活的活动。PPV课R语言读书会以“学习、分享、进步”为宗旨,通过成员协作完成R语言专业书籍的精读和分享,达到学习和研究R语言的目的。读书会由辅导老师或者读书会成员推荐书籍,经过讨论确定要读的书,每个月读一本书且要精读,大家一起分享。 第七章 基本统计 本章概要 1 描述统计 2 频次和相依表 3 相关系数和协方差 4 t-检验 5 非参数统计 本章所介绍内容概括如下。 一旦数据合理组织后,首先,基于数据可视化探索数据,接下来,我们要探索某个变量的分布
小莹莹
2018/04/19
7540
【学习】【R语言读书会】《R实战》读书笔记(第七章)
R语言能处理大数据吗?三点建议让你更好使用R语言
R语言究竟能不能处理大数据,其实这个问题的答案取决于你怎样定义所需处理的大数据。R是一种语言,同时也是一种工具,并且是运行在电脑上的,运行的结果也受到电脑的性能影响。那么既然要处理大数据,关键在于如何提高使用R语言处理分析数据的效率。 简单说,有三点: 1)使用运行速度更快的电脑; 2)学习使用各种高效的package; 3)使用Revolution R代替原生的R程序。 第一点暂不讨论,从第二点说起吧。 1. 适合处理大数据的R package 众所周知,R语言的主要优势在于各种包,有的包可以极大的提高工
企鹅号小编
2018/02/07
2.4K0
R语言能处理大数据吗?三点建议让你更好使用R语言
R语言从入门到精通:Day10
到目前为止,R语言的数据操作和基础绘图部分已经讲解完毕,换句话说,大家应该已经能将数据导入R中,并运用各种函数处理数据使其成为可用的格式,然后将数据用各种基础图形展示。完成前面这些步骤之后,我们接下来要探索数据中变量的分布以及各组变量之间的关系。
用户6317549
2019/09/24
2.3K0
R语言从入门到精通:Day10
R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)
终于开始攻克并行这一块了,有点小兴奋,来看看网络上R语言并行办法有哪些:
悟乙己
2019/05/26
9.1K0
数据流编程教程:R语言与DataFrame
DataFrame DataFrame 是一个表格或者类似二维数组的结构,它的各行表示一个实例,各列表示一个变量。 一. DataFrame数据流编程 二. 数据读取 readr/httr/DBI 1
小莹莹
2018/04/23
3.9K0
数据流编程教程:R语言与DataFrame
数据挖掘|R-相关性分析及检验
相关系数可以用来描述定量变量之间的关系。结果的正负号分别表明正相关或负相关,数值的大小则表示相关关系的强弱程度。
生信补给站
2020/08/06
2.5K0
相关性分析和相关性分析可视化常用方法汇总
上面还有一个缺陷,没有给出显著性检验,默认的cor.test只能对两个变量进行显著性检验,比如:
邓飞
2022/01/04
2.3K0
相关性分析和相关性分析可视化常用方法汇总
理解并行计算:r future为什么会启动比workers多得多的线程?
r的future包提供了一种实现多线程并行计算的接口,但有时候在使用时,我发现r启动了比我设定的多得多的计算资源。
王诗翔呀
2022/04/28
1.3K0
理解并行计算:r future为什么会启动比workers多得多的线程?
相关性分析返回相关性系数的同时返回p值
可以看到是20个m6a基因,以及 1.5万个lncRNA的表达量矩阵,而且样品数量是500个;
生信技能树
2022/03/03
7730
R自定义构建函数与批量绘图
上述代码我们将绘图代码打包成了一个函数,通过函数要绘制其它基因之间的关系就大大简化了代码,并可进行重复性操作
R语言数据分析指南
2022/09/21
8040
R自定义构建函数与批量绘图
「R」基本统计分析
因为书中列举的方法和知识点比较多,没必要全都掌握,会一种,其他的了解即可。我就简要地整理一下我觉得重要的吧。
王诗翔呀
2020/07/06
1.7K0
R语言相关分析和稳健线性回归分析
可以使用 cor.test函数。它可以执行Pearson,Kendall和Spearman相关。
拓端
2020/08/22
1.1K0
《高效R语言编程》7--高效优化
需要使用C++编译器,安装方法取决于操作系统,Linux:一般安装了R就会安装了;Mac:Xocode;Windows:Rtools,与版本要对应。需要用到的包:microbenchmark, ggplot2movies, profvis, Rcpp
用户1075469
2021/07/27
1.4K0
R语言学习笔记之——数据处理神器data.table
数据处理在数据分析流程中的地位相信大家都有目共睹,也是每一个数据从业者面临的最为繁重的工作任务。 在实际应用场景下,虽然SQL(SQL类专业的etl语言)是数据处理的首选明星语言,性能佳、效率高、容易培养数据思维,但是SQL没法处理构建全流程的数据任务,之后仍然需要借助其他数据分析工具来对接更为深入的分析任务。 R语言作为专业的统计计算语言,数据处理是其一大特色功能,事实上每一个处理任务在R语言中都有着不止一套解决方案(这通常也是初学者在入门R语言时,感觉内容太多无从下手的原因),当然这些不同方案确实存在
数据小磨坊
2018/04/12
3.7K0
R语言学习笔记之——数据处理神器data.table
推荐阅读
相关推荐
R语言性能Tips和GC
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档