提升R代码运行速度并不需要很高级的优化技术, 例如代码并行化, 使用数据库, 使用c++等. 实际上, 通过简单的操作, 就能够是R的运算速度显著的加快, 下面介绍几种方法. 1, 向量化R语言允许用户进行向量化编程, 这样速度更快. 比如我们计算100万随机数, 计算他们的平方, 这里使用两种方法: 第一种, for循环; 第二种, 向量化 set.seed(123) for循环system.time({ user system elapsed 直接在原向量上计算平方system.time({ user system elapsed head(dat);head(dd2) 速度由0.3s到0.02s 2, 预分配内存R语言是动态分布内存的, 不需要预先定义变量, 可以直接使用. 这种方法比较简单, 但是数据量大时, 会影响速度. 所以在使用变量时, 提前声明变量的大小, 会提升速度 不预先分布内存这个程序, 不知道dat的长度是多少, 因此是动态的内存结构. N = 1e5;N 1e+05 system.time({ user system elapsed 预先分配内存dat的长度是1e5, 因此我们可以生成这一个为0的向量, 这样他的内存就固定了 N = 1e4;N 10000 system.time({ user system elapsed 可以看到, 时间由7.5s降到0.11s 3, 使用apply函数代替for循环apply函数及其变种:
如果各个迭代之间相互独立, 那么apply函数是可以代替for循环的 for循环set.seed(123) system.time({ user system elapsed square = function(x){ return(x^2) system.time({tt = lapply(dat, FUN=square)}) user system elapsed t = rep(0,length(dat)) system.time({t = lapply(dat, FUN=square)}) user system elapsed 4, 使用matrix而不是data.table在矩阵运算时, 尽量转化为matrix格式 使用matrixdat = matrix(rnorm(1e4*1000),1e4,1000) dd = as.data.frame(dat) user system elapsed 使用data.frmaesystem.time( rowSums(dat)) user system elapsed
|
|