R语言高性能编程,优化,一

这段时间学习了<R高性能编程>这本书,基于这段时间做的项目实践,总结了一些自己的体会,和大家分享

一、为什么R程序有时候会很慢?

1、计算性能的三个限制条件 cpu ram io R代码本身

2、R是运行时解释的 在运行时解释并执行R代码

3、R是单线程的 CPU的强大核心并没卵用,R只会只用一个

4、R需要将全部数据加载到内存 处理的最大数据了取决于内存的限制

这里 linux相比于windows有一个优势,当我们试图装载一个可用内存大小的数据集

数据可能会成功装载,不过一旦可用内存耗尽,操作系统会将内存中的数据换到磁盘(交换空间)上

的交换文件,R人为数据全部装载入内存时间上OS正在做内存和磁盘文件的数据交换工作,如此一来,磁盘IO瓶颈对R性能就有着巨大的影响

5、算法设计影响时间和空间复杂度

时间复杂度:运行R程序需要的计算时间和数据规模之间的关系

空间复杂度:运行R程序需要的内存量和数据规模之间的关系

二、衡量代码的性能常用办法

使用system.time() benchmark() microbenchmark()

Rprof() 的工作原理是在运行R表达式的时候 ,观察R的调用栈,并以固定的时间,默认是0.02秒,对调用栈进行快照

,从而确定函数当前正在执行什么操作。通过这些快照,summaryRprof 能够计算每个函数的耗时

要理解R程序各个部分的性能,快速发现瓶颈,Rprof 是个很有用的工具

内存分析 memory.profiling=TRUE 这个指标会有误导,会偏高,因为有些函数内存尚未释放,

三、加快R运行的简单方法

1、尽量向量化运算,避免循环

2、使用内置函数。 R中存在很多低级运算符,虽然这些运算符可以组成更加复杂的运算符或者函数,但是和编译性语言相比性能很差,

但是R提供了很多C++编写的计算包。

比如计算 矩阵每一行的和,一般用apply可以解决问题,但是内置函数 rowSums,性能提升11倍,rowSums是使用C预编译的优化函数

开源社区开发了很多函数优化库供R使用,比如 basic linear algebra subprograms (BLAS) 详见:www.netlib.org.blas

3、预分配内存

为什么要预分配内存呢?主要是因为动态分配内存会拖慢程序的运行速度,每当向量大小发生变化,程序都需要做一些额外的工作

经过测试在一个简单的加法运算中,1000 长度的向量的计算,预分配内存之前为25.373秒,之后为0.577 秒

4、使用简单的数据结构

5、使用更加简单的数据结构

比如 如果可以的话,尽量使用matrix 而不是 dataframe,因为大部分矩阵操作首先要把dataframe强制转换为matrix,才开始计算。

如果数据中存在多种变量类型,不可避免的要使用dataframe的时候,尽量用subset 和 which 筛选子集后再做运算。

6、使用哈希表进行大型数据上的频繁查找

一个包含N个元素的列表上的查找操作的时间复杂度是O(N) 列表越靠后,查找时间越长,随着N的增加,情况越严重。

CRAN 上可用的R 包是hash, 哈希表上查找操作的时间复杂度为O(1)

7、去CRAN上寻找更快的包

例如:fastcluster,princomp,fastmatch,RcppEigen,data.table,dplyr

四、使用编译代码加快运行速度

1、在运行之前编译R代码 因为每次运行前都需要解析和评估代码。这需要话费大量CPU时间,拖慢运行速度。

利用compiler 包,能在一定程度上减少此问题,提前预编译。

cmpfun 编译函数

compile 编译表达式

cmpfile 编译存储在文件中的R表达式

2、即时编译 激活JIT(just in time) compiler 包的enableJIT

3、在R中使用编译语言 在R中嵌入C、C++、OC、OC++(inline包)

4、调用外部编译代码 Rcpp rJava

5、使用编译代码的注意事项

6、创建R对象及垃圾回收

预分配变量内存,PROTECT防止R的垃圾收集器清理对象。 UNPROTECT 解除已分配内存的保护

五、使用GPU让R运行的更快

这里需要注意的是在计算pearson相关性的时候,GPU是比CPU慢的

1、GPU最大的优势是核心数量巨多,所以最适合数据的并行问题,不适合那些线程之间需要大量同步的任务。

2、GPU的性能主要取决于主内存(RAM)和GPU内存之间的数据传输量,因为RAM和CPU内存之间的连接宽带很低。

优秀的GPU编程应该最小化这种传输

----------好了,截止到这里 我们已经了解了R为什么会慢以及如何衡量R代码的性能的问题;并且突破了CPU 限制,提升R程序性能的技术。

后面会以内存和IO方面作为突破口来优化代码,未完待续.....

原文出处:http://www.cnblogs.com/qiaoyihang/p/7779144.html