本文对应《R语言编程艺术》

第14章:性能提升:速度和内存;

第15章:R与其他语言的接口;

第16章:R语言并行计算

=========================================================================

性能提升:速度和内存

要使R代码运行速度更快,有以下建议:

  1. 通过向量化的方式优化、使用字节码编译等;
  2. 将代码中最消耗CPU的核心部分用编译型语言编写,如C或C++;
  3. 将代码用某种并行的方式编写。

消除显示循环:

采用向量化提升速度,因为采用显示循环涉及多次函数调用和迭代,耗费时间,而向量化函数内部是用编译型语言实现,因此会提升速度。

常用的加速代码的向量化函数:ifelse() /which() /where() /any() /all() /cumsum() /cumprod()等函数;用于矩阵的rowSums() /colSums()等函数;用于穷举所有组合问题的combn() /outer() /lower.tri() /upper.tri() /expand.grid()等函数。

尽管apply()可以消除显式循环,但它实际上是用R而不是C实现的,因此它通常并不能加速代码,只是使代码更加紧凑。然而,其他的apply函数,如lapply(),对于加速代码是非常有帮助的。

利用Rprof()来寻找代码的瓶颈:

首先调用Rprof()来开启监视器,然后运行代码,再调用带NULL参数的Rprof()来结束监视。最后,调用summaryRprof()来查看结果。

内存管理:

数据分块:read.table()函数的skip参数设置,可以分块读取数据。

R软件包的内存管理:RMySQL,提供R与MySQL的接口,将选择数据的操作放在数据库端;biglm包,可以在非常大的数据集上进行回归和广义线性模型的分析;ff包,通过将数据存放在硬盘上来回避内存的限制;bigmemory包,功能类似,但它不仅可以将数据存储在硬盘上,还可以将数据保存在机器的主内存中,这对于多核的机器而言是一个理想的选择。

=========================================================================

R与其他语言的接口

能被R调用的C/C++函数:

一般而言,这样做的目的是提升程序的性能;另一个原因是使用特殊的I/O操作(例如R使用的TCP协议速度不如C/C++使用的UDP协议)。

接口可以通过.C()或.Call()实现。.Call()提供了更全面的功能,但使用它需要对R的内部结构有所了解。

注意:C语言中,二维数组是按行进行存储的,而在R中则是按列存储;C语言下标是从0开始,而在R中是从1开始。

从Python调用R:

Python缺少内置的统计和数据处理功能,可以通过R来弥补。

RPy是一个Python模块,允许在Python中使用R。如果希望有额外的性能提升,则可以考虑与NumPy共同使用。

语法:R中的对象(函数)名冠上r.前缀。

注意:Python的语法中没有波浪号,因此在指定模型表达式时需要使用字符串;

需要一个数据框来包含数据;

如果R的函数名中带有英文句点,那么需要在Python中改为下划线。

>>> r.library(‘lattice’)
>>> r.assign(‘a’, a)
>>> r.assign(‘b’, b)
>>> r(‘g <- expand.grid(a, b)’)
>>> r(‘g$Var3 <- g$Var1^2 + g$Var1 * g$Var2’)
>>> r(‘wireframe(Var3 ~ Var1 + Var2, g)’)
>>> r(‘plot(wireframe(Var3 ~ Var1 + Var2, g))’)

=========================================================================

R语言并行计算

Snow包简介:主要过程:

  1. 加载代码
  2. 加载snow包
  3. 创建snow集群
  4. 建立相关的邻接矩阵
  5. 在创建的集群上针对邻接矩阵运行代码

OpenMP包:

利用R调用并行化的C

常用指令:

#pragma omp barrier

迭代型算法中常用,线程将在屏障处进行等待,直到每次迭代的结束

#pragma omp critical

{

// place one or more statements here

}

紧接着这一指令的代码块称为一个“关键区域”(critical section),意思是在这个区域中同时只允许一个线程执行这段代码

#pragma omp single

{

// place one or more statements here

}

紧接着这一指令的代码块将只被一个线程执行

简单并行(embarrassingly parallel):

指那些线程与线程之间不需要进行交互的并行方式,它们往往只需要将原始的程序稍加修改即可实现并行。这样,不仅编写简单,而且有着极地的通信开销。

静态和动态任务分配:

总体来说,动态任务分配因为有可能产生严重的缓存开销,因此实际上性能不如静态分配。

R语言编程艺术(5)R语言编程进阶的更多相关文章

  1. R语言编程艺术(4)R对数据、文件、字符串以及图形的处理

    本文对应<R语言编程艺术> 第8章:数学运算与模拟: 第10章:输入与输出: 第11章:字符串操作: 第12章:绘图 =================================== ...

  2. R语言编程艺术(3)R语言编程基础

    本文对应<R语言编程艺术> 第7章:R语言编程结构: 第9章:面向对象的编程: 第13章:调试 ============================================== ...

  3. R语言编程艺术(2)R中的数据结构

    本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ======================================== ...

  4. R语言编程艺术(1)快速入门

    这本书与手上其他的R语言参考书不同,主要从编程角度阐释R语言,而不是从统计角度.因为之前并没有深刻考虑这些,因此写出的代码往往是一条条命令的集合,并不像是“程序”,因此,希望通过学习这本书,能提高编程 ...

  5. <R语言编程艺术>的一个错误以及矩阵相加

    R语言编程艺术讲矩阵这节时,举了个随机噪声模糊罗斯福总统画像的例子.但是里面似乎有个错误,例子本意是区域外的值保持不变,而选定区域的值加一个随机值,但是实际情况是两个行列不相等的矩阵相加,会报错,如果 ...

  6. R语言编程艺术# 矩阵(matrix)和数组(array)

    矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数.所以矩阵也是和向量一样,有模式(数据类型)的概念.(但反过来,向量却不能看作是只有一列或一行的矩阵. 数组(array)是R里更一 ...

  7. R语言编程艺术#02#矩阵(matrix)和数组(array)

    矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数.所以矩阵也是和向量一样,有模式(数据类型)的概念.(但反过来,向量却不能看作是只有一列或一行的矩阵. 数组(array)是R里更一 ...

  8. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  9. 03--(二)编程实践中C语言的一些常见细节

    编程实践中C语言的一些常见细节(转载) 对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所 ...

随机推荐

  1. 【UOJ #351】新年的叶子(树的直径,期望)

    题目链接 这的确是一道好题,我们不妨依循思路一步步推导,看问题是如何被解决的. 做一些约定,设$m$为树的叶子节点个数,设$len$为该树的直径(经过的点数). 毫无疑问,直径可能有多条,我们需要把所 ...

  2. CF1096D Easy Problem(DP)

    貌似最近刷了好多的CF题…… 题目链接:CF原网 洛谷 题目大意:有一个长度为 $n$ 的字符串 $s$,删除第 $i$ 个字符需要代价 $a_i$.问使得 $s$ 不含有子序列(不是子串)" ...

  3. JavaScript学习复习

    JavaScript 输出 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML 文档中. 使用 innerHTML 写入到 HTML 元 ...

  4. 洛谷P3957 跳房子

    普及组的题.....填坑来了. 当年的我一眼二分+DP,现在都佩服起自己来了...... 然后我们就写个二分,在check里面写单调队列优化DP即可. 然后就A了...... #include < ...

  5. 通用权限管理系统底层更换最新Oracle驱动的方法

    通用权限管理系统底层先前访问Oracle数据库时需要客户端安装驱动软件,如下图: 安装完毕还需要一番配置,系统再引用其dll, 现在我们使用了最新的dll 该dll是Oracle出的最新的版本. 通用 ...

  6. Qt ------ WAV 音频文件播放

    1.用 QFile 打开 WAV 文件,读出文件头信息,看看是否符合音频播放设备的要求 QAudioDeviceInfo m_audioOutputDevice;//可以获取音频输出设备的信息,比如哪 ...

  7. python deamon(守护)线程的作用

    stackoverflow 上的解释 某些线程执行后台任务,例如发送keepalive数据包,或执行定期垃圾收集,或任何.这些仅在主程序运行时有用,并且一旦其他非守护程序线程退出就可以将其关闭. 没有 ...

  8. logstash marking url as dead 问题解决

    具体问题如下图所示: 将 INFO 信息打印大致如下所示: [2018-03-05T16:26:08,711][INFO ][logstash.setting.writabledirectory] C ...

  9. Angular2新人常犯的5个错误

    看到这儿,我猜你肯定已经看过一些博客.技术大会录像了,现在应该已经准备好踏上angular2这条不归路了吧!那么上路后,哪些东西是我们需要知道的? 下面就是一些新手常见错误汇总,当你要开始自己的ang ...

  10. C# p2p UDP穿越NAT,UDP打洞源码

    思路如下(参照源代码): 1. frmServer启动两个网络侦听,主连接侦听,协助打洞的侦听. 2. frmClientA和frmClientB分别与frmServer的主连接保持联系. 3. 当f ...