促销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]]
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2wxMTQzMDE1OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
參考:《R in a Nutshell》。这本书用来做入门书籍非常合适。
无论问题有针对性的建议表示欢迎,转载请注明出处,谢谢。
版权声明:本文博主原创文章,博客,未经同意不得转载。
促销R语言应用性能的更多相关文章
- R语言编程艺术(5)R语言编程进阶
本文对应<R语言编程艺术> 第14章:性能提升:速度和内存: 第15章:R与其他语言的接口: 第16章:R语言并行计算 ================================== ...
- R语言︱ROC曲线——分类器的性能表现评价
笔者寄语:分类器算法最后都会有一个预测精度,而预测精度都会写一个混淆矩阵,所有的训练数据都会落入这个矩阵中,而对角线上的数字代表了预测正确的数目,即True Positive+True Nagetiv ...
- 【机器学习与R语言】13- 如何提高模型的性能?
目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...
- 【机器学习与R语言】12- 如何评估模型的性能?
目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...
- R语言学习笔记(二十一五):如何如何提升R语言运算的性能以及速度
在R中获得快速运行代码的方法 使用向量化运算 R语言的并行计算可以用parallel和foreach包 加快R运行速度还可以使用cmpfun()函数即字节码编译器 再者就是在R中调用C或C++ 同时还 ...
- R语言:用简单的文本处理方法优化我们的读书体验
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...
- 微软的R语言发行版本MRO及开发工具RTVS
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软在收购R语言的开发商后,也独立发行或在自己的产品中集成了R语言,这里就介绍下它们包 ...
- [R语言]R语言使用多线程对数据库进行大批量访问时出现无法连接问题
问题描述: 在R中使用多线程对数据库进行写入,在服务器端运行脚本(linux环境),总是在第6-7万个任务线程时,出现无法连接到数据库的问题.任务中断,错误信息为task 6xxxx failed,C ...
- 如何在R语言中使用Logistic回归模型
在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...
随机推荐
- HDU 4344 随机法判素数(费马小定理
#include <cstdio> #include <ctime> #include <cmath> #include <algorithm> usi ...
- BDIA增强
SE24 CL_EXITHANDLER的方法GET_INSTANCE中有基本上所有的增强都会走这边,打上断点查找增强名称,或者在程序中全局搜索GET_INSTANCE关键字 然后 SE19 下 ...
- 【自由谈】城域网IPv6过渡技术——MAP技术(4)
本节接着回答MAP技术的第三个问题:“MAP-BR的Pool是如何实现?可靠性如何提升?” 在MAP域中通过将多个MAP-BR放在同一个Pool内实现负载分担和保护倒换的.同一个Pool中的每个MAP ...
- xPool - 基于mysqlclient的mysql的c++连接池 - xnhcx的个人空间 - 开源中国社区
xPool - 基于mysqlclient的mysql的c++连接池 - xnhcx的个人空间 - 开源中国社区 xPool - 基于mysqlclient的mysql的c++连接池
- 591 - Box of Bricks
Box of Bricks Little Bob likes playing with his box of bricks. He puts the bricks one upon another ...
- Effective C++ 24,25
24.在函数重载和设定參数缺省值间要谨慎选择. 获得一种类型的数据的最小值或最大值,对于c中,一般使用在<linits.h>中定义的各种宏如INT_MIN 来进行表示,可是这样无法进行泛型 ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- Cmpletepack coming~^.^
昨天小小总结了01背包:01背包 不足之处还望多提意见~噶呜~ 今天来总结一下完全背包: 完全背包: 基本思路:类似于01背包,所不同的是每种物品有无限件.也就是从每种物品的角度考虑,策略已经不 ...
- Net 通常用于dll 第三方插件
log4net.dll ----记录日志 本人用能够 pangu.dll ----分词工具 用于高级搜索 拆分字词 能够非常好用 fastreport --------高速制作报表工具 本人仅仅做过 ...
- C++中的#pragma 预处理指令详解
源地址:http://blog.csdn.net/roger_77/article/details/660311 在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态 ...