提升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()


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
R语言中,字节码编译是通过R的解释器和编译器的协作来实现的。下面是R语言字节码编译的简要原理: 1. 解释器:当你运行R代码时,解释器会逐行读取代码并执行。解释器会将代码翻译成一条条的指令,然后逐个执行这些指令。这种逐行解释执行的方式可以实现动态语言的灵活性和交互性。 2. 编译器:R语言还有一个即时编译器(Just-in-Time Compiler,JIT Compiler),它可以将一段代码(称为函数)编译字节码形式,以提高执行效率编译器会将函数的源代码分析并转换字节码表示形式。 3. 字节码字节码是一种中间形式的代码,它比源代码更接近于机器指令。字节码是由一系列的指令(例如,操作数栈操作、变量存取等)组成的,每条指令都对应着一种特定的操作。 4. 解释执行和即时编译:当解释器遇到已经被编译的函数时,它会直接执行对应的字节码指令,而不需要逐行解释执行源代码。这样可以提高函数的执行效率。 5. 缓存和优化:为了提高性能,R语言编译器通常会将编译后的字节码缓存起来,以便下次再次调用相同的函数时可以直接使用缓存的字节码。此外,编译器还会进行一些优化,例如代码内联、循环展开等,以进一步提高执行效率。 需要注意的是,R语言字节码编译是在函数级别进行的,并不是将整个脚本都编译字节码。只有在函数被调用时,才会将函数的代码编译字节码。这样可以灵活地处理不同函数的执行需求。 希望这个简要的解释能够帮助你理解R语言字节码编译的原理。如果你有更多具体的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值