打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
几种加快R语言运算的方法

提升R代码运行速度并不需要很高级的优化技术, 例如代码并行化, 使用数据库, 使用c++等. 实际上, 通过简单的操作, 就能够是R的运算速度显著的加快, 下面介绍几种方法.

1, 向量化

R语言允许用户进行向量化编程, 这样速度更快.

比如我们计算100万随机数, 计算他们的平方, 这里使用两种方法: 第一种, for循环; 第二种, 向量化

set.seed(123)
dat= rnorm(1000000)

for循环

system.time({
dd = NULL
for(i in 1:length(dat)){
dd[i] = dat[i]^2
}
})
user system elapsed
0.31 0.03 0.35

    直接在原向量上计算平方

    system.time({
    dd2 =dat^2
    })
    user system elapsed
    0 0 0
    head(dat);head(dd2)

    速度由0.3s到0.02s

    2, 预分配内存

    R语言是动态分布内存的, 不需要预先定义变量, 可以直接使用. 这种方法比较简单, 但是数据量大时, 会影响速度. 所以在使用变量时, 提前声明变量的大小, 会提升速度

    不预先分布内存

    这个程序, 不知道dat的长度是多少, 因此是动态的内存结构.

    N = 1e5;N

    1e+05

    system.time({
    dat =1
    for(i in 2:N){
    dat = c(dat,dat[i-1]+sample(1:2,size = 1))
    }
    })
    user system elapsed
    8.88 0.15 9.07

    预先分配内存

    dat的长度是1e5, 因此我们可以生成这一个为0的向量, 这样他的内存就固定了

    N = 1e4;N
    dat = rep(0,N)

    10000

    system.time({
    dat =1
    for(i in 2:N){
    dat = c(dat,dat[i-1]+sample(1:2,size = 1))
    }
    })
    user system elapsed
    0.14 0.00 0.14

    可以看到, 时间由7.5s降到0.11s

    3, 使用apply函数代替for循环

    apply函数及其变种:

    • lapply

    • sapply

    • tapply

    如果各个迭代之间相互独立, 那么apply函数是可以代替for循环的

    for循环

    set.seed(123)
    dat= rnorm(1000000)
    system.time({
    dd = NULL
    for(i in 1:length(dat)){
    dd[i] = dat[i]^2
    }
    })
    user system elapsed
    0.28 0.00 0.28
    square = function(x){ return(x^2)
    }
    system.time({tt = lapply(dat, FUN=square)}) user system elapsed
    1.00 0.00 1.02
    t = rep(0,length(dat))system.time({t = lapply(dat, FUN=square)}) user system elapsed
    0.62 0.03 0.66

    4, 使用matrix而不是data.table

    在矩阵运算时, 尽量转化为matrix格式

    使用matrix

    dat = matrix(rnorm(1e4*1000),1e4,1000)dd = as.data.frame(dat)
    system.time( rowSums(dd))
    user system elapsed
    0.05 0.00 0.05

    使用data.frmae

    system.time( rowSums(dat)) user system elapsed
    0.04 0.00 0.03
    本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
    打开APP,阅读全文并永久保存 查看更多类似文章
    猜你喜欢
    类似文章
    【热】打开小程序,算一算2024你的财运
    禁止迅雷偷偷上传已下载的文件
    自定义你的pheatmap热图
    C#中timer类的用法
    R语言 循环时了解程序进程
    手机内存不足怎么办|总是提示手机内存不足,怎样才能获_内存知识网
    R语言笔记4:向量、矩阵的数学运算
    更多类似文章 >>
    生活服务
    热点新闻
    分享 收藏 导长图 关注 下载文章
    绑定账号成功
    后续可登录账号畅享VIP特权!
    如果VIP功能使用有故障,
    可点击这里联系客服!

    联系客服