提升R语言程序性能

1.       性能测评

时间测定方法

R中提供的测量时间最简单的方法是system.time函数。

system.time(expr, gcFirst=TRUE)

这个函数会在不降低程序运行性能的情况下,执行表达式expr,gcFrist则是指定程序运行前是否先执行垃圾回收。

do.stuff <- function(){
a <- 1:100000
for(i in 1:100000){
           a[i] <- a[i]^2
}
a
}
system.time(do.stuff())

监控内存方法

R中函数gc(),有两个功能,一是立即执行一次垃圾清理,二是显示剩余内存的统计信息。

gc()

used是当前使用情况,gc trigger是会触发垃圾回收的值,max used是上次gc()操作或者是此次启动R后使用最大值。(Mb)是Ncells和Vcells的大小转换为Mb单位时的值。

Ncells即cons cells,32位R中占28B,64位R中占56B,我是用的32位的R,所以2616689*28/(1024^2) = 69.9。

Vcells即vector cells,占8B,所以63817864*8/(1024^2) = 486.9。

不是很懂Ncells和Vcells分别指的是R中的什么对象,网上也没找到很确切的说法,所以不知道应该怎么去翻译它们,有知道的朋友希望能告知,谢谢!

R中object.size()函数可以查看每个对象占用内存数。

object.size(1)
object.size(train)

R中memory.profile()函数可以查看不同对象类型的内存占用情况。

memory.profile()

不过memory.profile()展示的是Ncells的统计量,可以看到gc()中查到的Ncells使用数跟memory.profiles()的总量非常接近。

R中memory.size()函数,可以查看到R使用的内存大小,还可以设置参数max=TRUE,来查看上次gc()操作或者是此次启动R后使用的最大的内存数。

memory.size()
memory.size(max=TRUE)

时间性能分析

R中有Rprof()方法,能监控R语言程序中每一个操作语句的耗时。

Rprof(filenames=”Rprof.out”,append=FLASE,interval=0.02,memory.profiling=FALSE)

filenames 输出文件路径

append 向已存在文件追加内容还是覆盖已存在文件

interval 采用时间间隔

memory.profiling 是否将内存信息写入文件

启动性能监控是Rprof(filename)

停止性能监控时Rprof()或者Rprof(NULL)

summaryRprof()方法可以查看Rprof()性能采集的结果。

summaryRprof(filenames=”Rprof.out”,chunksize=5000,memory=c(“none”,”both”,”tseries”,”stats”),index=2,diff=TRUE,exclude=NULL)

filenames 输出文件路径

chunksize 一次读取的行数

memory 如何显示内存消耗信息,分别是不显示,时间和内存信息都显示,一时间序列的方式显示,显示内存消耗统计量。

index 是否将内存的信息写入文件

diff 在内存统计量中是否显示内存使用的变化,或者总的内存消耗

exclude 指定排除在统计结果之外的函数

这个部分不给出详细的例子了,可以看这篇文章里面讲到的性能监控的例子,使用的就是这两个函数:http://blog.fens.me/r-perform-rprof-profr/

内存性能分析

R中有Rprofmen

Rprofmem(filename = "Rprofmem.out", append =FALSE, threshold = 0)

filenames 输出文件路径

append 向已存在文件追加内容还是覆盖已存在文件

threshold 内存分配大于这个值的才会被记录,单位字节

启动性能监控是Rprofmem (filename)

停止性能监控时Rprofmem ()或者Rprofmem (NULL)

查看运行结果,直接读取filename就行。下面的例子,是函数说明文档中的例子:

Rprofmem("Rprofmem.out", threshold = 1000)
example(glm)
Rprofmem(NULL)
noquote(readLines("Rprofmem.out", n = 5))

2.       优化R代码

使用向量操作

R的一个很大的特点就是能进行向量操作,相比循环迭代的方法而言,向量操作的效率更高。

square.two <- function(n){
v <- numeric(0)
length(v) <- n
for(i in 1:n){
           v[i] <- i^2
}
v
}
square.two (10)
system.time(square.two (10000))
system.time(square.two (100000))
system.time(square.two (1000000))

结果如下图,可以看出来,消耗的时间随向量长度线性增长。

用向量来实现平方运算这个函数,代码如下:

better. square <- function(n){
	(1:n)^2
}
better.square (10)
system.time(better.square (10000))
system.time(better.square (100000))
system.time(better.square (1000000))

可以看到,相比前面循环实现方式而言,向量运算快了很多。

使用内置函数

大部分情况下,内置函数要比自己写的代码性能更好。R中的内置函数经常由是其他语言(通常是C和Fortran),实现的编译过的代码,这些函数的运行效率比解释性的R程序强很多。其实上面的向量操作也可以看做是使用R的内置函数,不举更多的例子了。

内存预分配

频繁地申请内存会加大程序的耗时,这个在很多编程语言中都是这样。R语言操作对象不需要提前分配内存,但提前分配好内存能加快运行速度。还是平方运算的例子,提前分配内存和不提前分配内存在数据量大时,运行时间性能上差异很大。当然,我们已经知道了一个更加快的方式——向量操作。

square.one <- function(n){
v <- numeric(0)
for(i in 1:n){
           v[i] <- i^2
}
v
}

square.two <- function(n){
v <- numeric(0)
length(v) <- n
for(i in 1:n){
           v[i] <- i^2
}
v
}

查找性能

R语言中,向量查找的方式有很多。下标查找,名字标签单括号查找,名字标签双括号精确查找,名字标签双括号模糊查找等。

这几种查找方式的时间复杂度:

下标查找:时间复杂度1;

名字标签单括号查找:时间复杂度n;

字标签双括号精确查找(默认):时间复杂度1;

名字标签双括号模糊查找:时间复杂度1。

这个也是在写R程序过程中,可能提升程序效率的一个地方。

精确查找和模糊查找的说明:

diary <- list(milk="1 gallon",butter="1 pound",eggs=12)
diary[["milk"]]
diary[["mil"]]
diary[["mil",exact=FALSE]]

参考:《R in a Nutshell》,这本书用来做入门书籍很合适。

有任何问题建议欢迎指出,转载请注明出处,谢谢!

时间: 2024-09-28 16:31:38

提升R语言程序性能的相关文章

R语言学习笔记(二十一五):如何如何提升R语言运算的性能以及速度

在R中获得快速运行代码的方法 使用向量化运算 R语言的并行计算可以用parallel和foreach包 加快R运行速度还可以使用cmpfun()函数即字节码编译器 再者就是在R中调用C或C++ 同时还可以利用Rprof()来寻找代码的瓶颈 利用分块或者R包来管理内存 原文地址:https://www.cnblogs.com/xihehe/p/8318919.html

11个显著提升 ASP.NET 应用程序性能的技巧——第1部分

采用 ASP.NET 和 IIS 构建 Web 应用程序并将其托管到 Web 服务器上极其简单,但是许多可提升 Web 应用程序性能的机会或隐藏配置同样不能忽视.本系列博文将介绍一些简单但却可以应用于任何 Web 应用程序的技巧,而它们却是经常被忽略或遗忘的. 1- 内核模式缓存--这是广泛用于程序编写的主要工具之一,可加速 Web 应用程序.但是大多数时候,很少开发者以最佳方式应用内核模式缓存,仅仅发挥其部分主要优势.由于所有 ASP.NET 请求均会经历不同阶段,因此可在不同级别使用缓存,具

R语言基础编程技巧汇编 - 26

1.      监视R语言包更新状态的网站 R语言包的数量已经有近万个,及时关注新发布的包,以及已发布的包的更新状态,非常重要,下列网站提供了这个功能,读者可以经常访问: http://lib.stat.cmu.edu/R/CRAN/web/packages/available_packages_by_date.html 2.      使用命令行参数的R程序示例 以Windows系统为例,按照以下步骤: 1.    把Rscript.exe的路径加入到Path环境变量中,在我的机器上设置如下:

第七届R语言会议 - 小记

第七届中国R语言会议 小记 R语言始于1993年,并在1995年首次发布,后来经过2000年R-1.0,2004年R-2.0和2013年R-3.0,以61%的得票荣登世界编程或同积累语言排行榜榜首,远超Python,SQL,SAS,JAVA,Excel和Rapidminer. R最初是一种基于数学的脚本语言,前身为S语言.但是论数学,远不及专业的Matlab和SAS:论脚本功能,又远不及Python和Perl.但是,随着R语言的发展,在功能强大的IDE,RStudio和R本身开源的双重帮助下,R

R语言调用C++

R语言跨界调用C++ R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器.随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长.现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言. 要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域.让我们

基于R语言的数据分析和挖掘方法总结——均值检验

2.1 单组样本均值t检验(One-sample t-test) 2.1.1 方法简介 t检验,又称学生t(student t)检验,是由英国统计学家戈斯特(William Sealy Gosset, 1876-1937)所提出,student则是他的笔名.t检验是一种检验总体均值的统计方法,当数据中仅含单组样本且样本数较大时(通常样本个数≧30的样本可视为样本数较大),可用这种方法来检验总体均值是否大于.小于或等于某一特定数值.当数据中仅含单组样本但样本数较小时(通常样本个数<30的样本可视为

R语言 典型相关分析

1.关键点 #典型相关分析##典型相关分析是用于分析两组随机变量之间的相关程度的一种统计方法,它能够有效地揭示两组随机变量之间的相互(线性依赖)关系#例如 研究生入学考试成绩与本科阶段一些主要课程成绩的相关性#将研究两组变量的相关性问题转化为研究两个变量的相关性问题 此类相关为典型相关##总体典型相关#样本典型相关#典型相关计算 cancor(x,y,xcenter=TRUE,ycenter=TRUE)#x,y是相应的数据矩阵 xcenter,ycenter是逻辑变量 TRUE是将数据中心化 F

R 语言实现求导

前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽脑汁,但始终都不知道为何而学.生活和工作基本用不到,就算是在计算机行业和金融行业,能直接用到高数的地方也少之又少,学术和实际应用真是相差太远了. 不过,R语言为我打开了一道高数应用的大门,R语言不仅能方便地实现高等数学的计算,还可以很容易地把一篇论文中的高数公式应用于产品的实践中.因为R语言我重新学习了高数,让生活中充满数学,生活会变得更有意思. 本节并不是完整的高数计算手册,仅介

R语言的导数计算(转)

转自:http://blog.fens.me/r-math-derivative/ 前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽脑汁,但始终都不知道为何而学.生活和工作基本用不到,就算是在计算机行业和金融行业,能直接用到高数的地方也少之又少,学术和实际应用真是相差太远了. 不过,R语言为我打开了一道高数应用的大门,R语言不仅能方便地实现高等数学的计算,还可以很容易地把一篇论文中的高数公式应用于产品的实践中.因为R语言我重新学