提升R语言运行效率-转换为字节码编译

# 将函数、文件、包编译成字节码文件可以大大提高运行速度,这是系统性能优化的重要方法之一

# 实验发现使用compiler包编译函数非常简单、方便,性能提升效果立竿见影

# compiler包似乎是随系统一起安装的核心包,并且函数数量不多,容易掌握

# compiler包是系统核心包之一,并不需要专门下载安装

## 01、compiler #####################################################################################
library(compiler)
 
#cmpfun()函数:
# 测试函数
# 分10次每次生成100万个正态分布的随机数
TstFun <- function(){
  for( i in 1:10){  
    x1 <- (rnorm(1000000,100,30)) 
    i <- i + 1
  }    
}
# 使用cmpfun()函数编译TstFun()函数为字节码函数
# 同时将字节码函数加载到内存中以便调用
CTstFun <- cmpfun(TstFun) 

# 普通方式调用函数
system.time(TstFun())
 
# 调用字节码函数
# 运行时间有明显减少
system.time(CTstFun())  
  
f <- function(x) print(x)
cf <- cmpfun(f)
cf(2)
   
#disassemble()函数:
# disassemble()函数将加载到内存中的字节码函数卸载掉
 
# 卸载掉函数
disassemble(CTstFun)  
  
# 卸载之后还是可以使用
system.time(CTstFun())  
 

## 02、compiler  #####################################################################################
# 生成1000万的正态分布随机数并赋值的表达式
tmp1 <- rnorm(1e7,100,30)
# 把表达式编译为字节码
ce <- compile(rnorm(1e7,100,30));ce # 输出的是字节码对象
  
# 再次编译之后得到的字节码对象不同
ce <- compile(rnorm(1e7,100,30));ce
  
system.time(tmp1 <- rnorm(1e7,100,30))


# 编译整个R脚本为字节码文件
# 用普通文本编辑器打开cx文件发现并不是一般的文本文件
# 输出文件一般使用扩展名.Rc以便和一般R语言文件扩展名区分
cmpfile("x.R","x.Rc")
#x.R是输入文件,内容如下:  
i <- 1
sum <- 0
print("前两行代码已经运行!")
print("开始进入循环")  
while(i <= 100){
  sum <- sum + i
  i <- i + 1    
}
print(sum)
   
  
  
# 装载经过编译的x.Rc文件成功(此处loadcmp("x.R")则会出错)
# 加载字节码文件后立即执行
# 这个加载过程和sys.source()类似
# 但同上述函数不同的是:默认将代码文件加载到全局环境而非基础环境中
loadcmp("x.Rc")


  
  
# 启用或禁用:JIT,just-in-time编译器
# 参数设置为0,则不使用JIT编译器
# 参数设置为1,函数在第一次使用前就编译
# 参数设置为2,函数第2次调用前编译;这对一些扩展包很有用比如lattice,它在列表中存储函数
# 参数设置为3,所有循环在调用前都被编译
  
# JIT参数也可以在启动R时通过环境变量R_ENABLE_JIT做设置 
enableJIT(0)
enableJIT(1)  
enableJIT(3)
  
  
# 当扩展包安装时,启用/禁用编译扩展包
# 也可以在R启动时,通过设置环境变量R_ENABLE_PKGS
compilePKGS(T)
compilePKGS(F)  
  
####来源地址:http://blog.163.com/george_xuehui/blog/static/1158863572014511114134399/


#向量化实现也是很重要的优化方法
向量化函数:ifelse(),which(),where(),any(),all(),cumsum(),cumprod(),pmax()
对矩阵而言:rowSums(),colSums()

穷举:combn(),outer,lower.tri(),upper.tri(),expand.grid()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值