性能测量
system.time()时间测定
Rprof和profr性能分析
R语言性能监控工具Rprof
How to efficiently use Rprof in R?
library(profr)
#日志存放路径
file<-"fun1_rprof.out"
Rprof(file)
trainAndtest(mp_id[1])#被检测程序
Rprof(NULL)
#显示日志
summaryRprof(file)
#图形化
plot(parse_rprof(file))
ggplot(parse_rprof(file))
by.self: 当前函数的耗时情况
by.total :整体函数调用的耗时情况
gc()监控内存使用
参考博客:R的内存管理:rm()和gc()共用释放占用的内存
优化R代码
向量操作
用循环算平方与直接调用向量操作比较
#迭代法
vative.vector.of.squares <- function(n){
v <- 1:n
for(i in 1:n)
v[i] <- v[i]^2
v
}
system.time(vative.vector.of.squares(10000))
system.time(vative.vector.of.squares(10000000))
> system.time(vative.vector.of.squares(10000))
user system elapsed
0.029 0.000 0.029
> system.time(vative.vector.of.squares(10000000))
user system elapsed
15.354 0.080 15.423
发现消耗的时间会随着响亮的长度(n)线性的增长。
#向量操作
better.vector.of.squares <- function(n){
(1:n)^2
}
system.time(better.vector.of.squares(10000))
system.time(better.vector.of.squares(10000000))
> system.time(better.vector.of.squares(10000))
user system elapsed
0 0 0
> system.time(better.vector.of.squares(10000000))
user system elapsed
0.227 0.050 0.277
这里的^是直接用C语言或者Fortran语言实现的,不需要通过R的解释器来计算,只需要调用一次底层库就可以得到结果。很多常用的数学函数都包含在R的原声函数中,大部分情况下,这些函数都是通过调用外部的代数运算库来实现的。
使用内置函数
R中的查找性能
> data
a b c
1 2 3
- 通过下标查找O(1)
- 通过名字标签查找,使用单括号查找操作符: O(n)
- 通过名字标签查找,使用双括号查找操作符进行精确查询: O(1) data[[‘a’]]
- 通过名字标签查找,使用双括号查找操作符进行模糊查询: O(1) data[[‘a’,exact=FALSE]]
- 通过名字标签查找,使用环境:平均为O(1)
get(data=’a’,envir=env)
尽量使用[[来查找精确值x[[1]],x[[‘a’]]速度较快。p(541)