R语言多任务处理与并行运算包——foreach

2023-10-26

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

作者简介Introduction

杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。

个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。 


精彩集锦

那些年倒腾的R语言学习笔记,全都在这里了~

640?wx_fmt=gif&wxfrom=5&wx_lazy=1&retryload=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1&retryload=1点击图片,领取限时优惠

相信大部分R语言初学者,在刚开始入门之处,都曾被告诫在处理多重复任务时,尽量不要使用显式的for循环,而要尽可能的使用R语言内置的apply组函数,这样可以极大地提高代码运行效率。

但是实际上除了内的apply组函数之外,你还有另外一个更好地选择,就是利用一些支持并行运算的扩展包,来发挥本地计算机的多和计算优势。

本篇要讲解的包是foreach包,这是一个支持在R语言中调用多进程功能的第三方包,之前在对比显式循环、矢量化函数以及多进程在数据抓取的效率一文中,曾经演示过具体的代码。

library("foreach")
library("doParallel")

foreach包执行任务的核心理念与传统的apply组函数基本一致,都是与split – apply – combine一致的流程,不过foreach比传统apply组函数的优越之处在于,它可以通过调用操作系统的多核运行性能来执行并行任务,这样特别是对于I/O密集型任务而言,可以大大节省代码执行效率。

foreach(...,            #待输入的参数       .combine,        #结果返回后执行的数据合并操作(c代表合并为向量,list代表合并为列表,rbind代表合并为数据框)       .packages=NULL,  #在多进程共享的程序包(仅对于非系统安装包必备)       .export=NULL,    #未在当前环境中定义的数据对象       .verbose=FALSE   #是否打印运行信息       )

以上函数中,第1个参数是必备参数,即必须有输入参数,结果默认返回list。

foreach函数用于定义执行多进程任务的函数,任务的执行则需要使用%do%/%dopar%函数,前者执行的是普通的单进程任务(与apply组函数一样),后者则可以执行多进程任务。

接下来我们演示一遍整个多进程任务的过程:

首先定义一个执行函数:

library("httr") library("jsonlite")
library("magrittr")
GETPDF <-  function(i){  url<-"https://index.toutiao.com/api/report"  headers<-c(            "Host"="index.toutiao.com",     "User-Agent"="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"  )  payload <-list("page"=1,"size"=12)    payload[["page"]]=i    web <- GET(url,add_headers(.headers = headers),query = payload)    content <- web %>% content(as="text",encoding="UTF-8") %>% fromJSON() %>% `[[`(9)  }

2、执行多进程函数

方案1——使用%do%函数执行普通的向量运算

library("doParallel")      #加载doParallel包用于之后注册进程
library("foreach")         #导入foreach包

system.time({  cl<- makeCluster(4)        registerDoParallel(cl)       #进行进程注册  mydata1 <- foreach(
             i=1:16,          #输入等待请求的参数              .combine=rbind,  #返回结果的整合              .packages = c("httr", "jsonlite","magrittr")
             #多个进程共享的系统环境  ) %dopar% GETPDF(i)  stopCluster(cl)})用户 系统 流逝 0.08 0.01 2.18

方案2——使用%dopar%函数执行多进程的运算

system.time({  cl<-makeCluster(4)  registerDoParallel(cl)  mydata2 <- foreach(i=1:16,.combine=rbind) %do% GETPDF(i)  })用户 系统 流逝 0.39 0.03 4.53

因为%do%操作是单进程的,因而即便启动多进程环境也是徒劳。

DT::datatable(mydata1)

640?wx_fmt=jpeg


可以看到,%dopar%操作比%do%操作仅仅节省了0.04秒左右,但是鉴于抓包的请求频率比较高,这样多进程所节省的时间效率感知不够明显。

system.time(mydata3 <- plyr::ldply(1:16,GETPDF))用户 系统 流逝 0.32 0.00 4.54

整体时间效率比较:

ldply > %do% >  %dopar%4.54  > 4.53 >  2.18

从时间效率上来看,的确节省了将近50%的时间。如此高逼格的神器,怎能不学呢~~


如果你想要深入的去学ggplot2,但是又苦于平时学习、工作太忙木有时间研究浩如烟海的源文档,那也没关系,本小编最近花了不少功夫,把我自己学习ggplot2过程中的一些心得体会、学习经验、仿入坑指南精心整理,现已成功上线了R语言ggplot2可视化的视频课程,由天善智能独家发行,希望这门课程可以给你的R语言数据可视化学习带来更加丰富的体验。

相关课程推荐

体系全面,最具调性!R语言可视化&商务图表实战课程:

640?wx_fmt=png


640?wx_fmt=gif

点击“阅读原文”开启新姿势

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R语言多任务处理与并行运算包——foreach 的相关文章

  • 三阶段提交协议(3PC)

    3PC 主要是为了解决两阶段提交协议的单点故障问题和缩小参与者阻塞范围 引入参与节点的超时机制之外 3PC把2PC的准备阶段分成事务询问 该阶段不会阻塞 和事务预提交 则三个阶段分别为CanCommit PreCommit DoCommit
  • codeforces 526D(kmp,数学)

    description One day Om Nom found a thread with n beads of different colors He decided to cut the first several beads fro
  • 内核体系结构和编译体系分析

    1 Linux操作系统体系结构 1 操作系统可以分为两个层次 内核空间和用户空间 内核和用户空间使用不同的保护地址空间 内核不能将用户空间传递的地址进行直接的操作 需要先转换 2 系统调用 内核空间管理设备资源 应用程序通过内核提供的内核调
  • 米家接入HomeKit系列三:HomeAssistant接入米家网关

    系列文章 米家接入HomeKit系列一 接入基本原理与开篇 米家接入HomeKit系列二 通过群辉NAS的Docker搭建HomeAssistant 米家接入HomeKit系列三 HomeAssistant接入米家网关 米家接入HomeKi
  • 微信小程序--web-view--h5返回微信小程序

    1 配置微信小程序 web view 记得配置业务域名 微信公众平台配置业务域名 上线需要 1 1 建议微信小程序里单独用一个页面打开
  • debug

    1 在DOS提示符下 进入Debug程序 2 详细记录每一步所用的命令 以及查看结果的方法和具体结果 3 现有一个双字加法源程序如下 其中存在错误 现假设已汇编 连结生成了可执行文件HB EXE 存放在d MASM目录下 请使用Debug对
  • argmax与max的区别

    y max f x 表示y是函数f x 的最大值 y argmax f x 表示y为函数f x 取得最大值时 参数x的值 例 f x x3 x的取值范围是 0 1 2 3 y max f x 27 y argmax f x 3
  • AcWing 907. 区间覆盖 贪心

    AcWing 907 区间覆盖 给定N个闭区间 ai bi 以及一个线段区间 s t 请你选择尽量少的区间 将指定线段区间完全覆盖 输出最少区间数 如果无法完全覆盖则输出 1 输入格式 第一行包含两个整数s和t 表示给定线段区间的两个端点
  • 数据分析中的统计与机器学习应用

    1 数据分析应用场景 数据分析场景 例如逛淘宝 后台一般会从以下几个方面对用户数据进行分析来 了解的一个产品的数据模型 1 Acquisition 获取用户 运营一件产品首先就需要获取用户 也就是推广 运营人员要分析自己产品的特性以及想要推
  • 一文看懂PCB助焊层跟阻焊层的区别与作用

    一文看懂PCB助焊层跟阻焊层的区别与作用 PCBworld 今天 阻焊层简介 阻焊盘就是soldermask 是指板子上要上绿油的部分 实际上这阻焊层使用的是负片输出 所以在阻焊层的形状映射到板子上以后 并不是上了绿油阻焊 反而是露出了铜皮
  • zookeeper 搭建集群

    待完善
  • 《计算机文化基础》22-23第一学期后十周教学计划(中国铁道出版社第三版)

    课程 任课教师 授课班级 编制时间 计算机文化基础 2022 10 28 授课日期 2022年 10月31日至 2022年 12月 16日 本课程总课时 28课时 已授课时 0 课时 尚余课时 28课时 本学期授课周 7周 本学期周课时 4
  • 超详细讲解!Android面试题集2021版,面试心得体会

    前言 Android常用知识体系是什么鬼 所谓常用知识体系 就是指对项目中重复使用率较高的功能点进行梳理 注意哦 不是Android知识体系 古语道 学而不思则罔 思而不学则殆 如果将做项目类比为 学 那么整理就可以类比为 思 在做项目过程
  • 文件包含漏洞

    一 文件包含函数 将外部文件的内容引入当前环境 include
  • 玩转Kali之初始化系统

    文章目录 下载镜像 安装系统 修改root密码 配置APT国内源 更新软件包 下载镜像 1 打开kali官网 https www kali org 安装系统 1 打开VirtualBox 2 选择新建虚拟机 1 输入虚拟机名称 2 选择安装
  • TopK问题的三种解法

    TopK问题是指从n个数据中取前K个数据 在生活中的应用也有很多 如游戏中xxx的排行榜前10名等 在这篇博客中我将主要利用堆去解决TopK问题 堆排序 首先我们需要建一个堆 然后我们再进行堆排序 排好序后直接取前K个就可以了 需要注意的是
  • Debian10iptables放行语法

    文章目录 1 基本语法 2 修改默认规则 3 实例 4 易错总结 1 基本语法 iptables A 链 匹配条件 j 动作 D 删除 p 协议 ACCEPT 放行 s 源ip地址 DROP 丢弃 d 目的ip地址 REJECT 拒绝 sp
  • java.util.EnumSet complementOf (EnumSet<E> s)方法具有什么功能呢?

    转自 java util EnumSet complementOf EnumSet lt E gt s 方法具有什么功能呢 下文笔者讲述EnumSet complementOf方法的功能简介说明 如下所示 EnumSet complemen
  • To Java程序员:切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说 可能平时使用得最多的List就是ArrayList 对于ArrayList的遍历 一般用如下写法 public static void mai
  • 余弦定理实现新闻自动分类算法

    前言 余弦定理 这个在初中课本中就出现过的公式 恐怕没有人不知道的吧 但是另外一个概念 可能不是很多的人会听说过 他叫空间向量 一般用e表示 高中课本中有专门讲过这个东西 有了余弦定理和向量空间 我们就可以做许多有意思的事情了 利用余弦定理

随机推荐

  • Spring框架(三)Spring注解和获取Bean对象详解

    目录 一 什么是基于Java的Spring注解配置 具体注解的例子 二 更好的将Bean存储在Spring中 1 前置工作 在配置文件中设置Bean根路径 2 添加注解存储Bean对象 2 1 Controller 控制器存储 2 2 Se
  • Vue中 实现上一篇下一篇的功能

    效果 看下html页面 div class NewsDetails cont footer div img src assets img newsDetail 公共 更多2 1 png alt span 上一篇 lastTitle span
  • 软件开发 文档 质量

    1 在撰写API文档时 如果某个API的性能 时间性能 内存性能 特别低 应该在文档里详细列出 如此做的好处是 1 1 有助于客户在设计阶段 采用正确 高效的方案 1 2 对于开发这个API的team 可以减轻维护压力 明确责任 因为在文档
  • 中文同义句在线转换器 - 中文同义句转换器软件

    在线同义句转换器 中文同义句在线转换器 中文同义句转换器软件 made in Japan 祝你学习进步 更上一层楼 请记得采纳 谢谢 同义句转换器 1 I d like to go to the beach on vacation beca
  • 【1803. 统计异或值在范围内的数对有多少】

    来源 力扣 LeetCode 描述 给你一个整数数组 nums 下标 从 0 开始 计数 以及两个整数 low 和 high 请返回 漂亮数对 的数目 漂亮数对 是一个形如 i j 的数对 其中 0 lt i lt j lt nums le
  • 2019年黑马新版Java学习路线图(内含大纲+视频+工具+书籍+面试)面试必看!

    非常好的java学习路线 伴有配套资源 面试必看 黑马程序员 http bbs itheima com thread 386464 1 1 html
  • LEVELDB介绍

    基本信息 特性 keys 和 values 是任意的字节数组 数据按 key 值排序存储 调用者可以重载函数来重写排序顺序 提供基本的 Put key value Get key Delete key Batch 操作 多个更改可以在一个原
  • JWT

    1 常见的认证机制 1 1 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password 简言之 Basic Auth是配合RESTful API 使用的最简单的
  • SpringBoot整合Shiro

    一 pom xml引入依赖 1 shiro依赖
  • python3+tkinter实践历程(四)——模仿CRT完成基于socket通信与tkinter的TCP串口客户端

    python3 tkinter实践历程 四 基于socket通信与tkinter的TCP串口客户端 仿CRT 文章目录 系列文章目录 分享背景 制作背景 最终功能 工具截图展示 代码详解 系列文章目录 python3 tkinter实践历程
  • 天龙八部手游服务器维护公告,天龙八部手游更新维护公告 龙腾迎春全新资料片来袭...

    天龙八部手游终于迎来全新资料片 龙腾迎春啦 本次更新将加入全新帮派副本决战少室山 并且玩家们可以觉醒独特的至尊武魂 玩家们可以凭自己的喜好改变武魂的外观 一起来了解一下详细更新内容吧 更新时间 1月31日4 00 8 00 更新奖励 300
  • 查看表被数据库中其他对象使用

    select from dba dependencies where referenced name upper xxx
  • java求六位数以内所有自幂数

    如果在一个固定的进制中 一个n位自然数等于自身各个数位上数字的n次幂之和 则称此数为自幂数 以下用java语言求六位数以内所有自幂数 独身数共有9个 1 2 3 4 5 6 7 8 9 水仙花数共有4个 153 370 371 407 四叶
  • angular.js中的复选框checkbox的用法

    首先在head里引入 页面部分 div div div div
  • RestfulTool插件使用详解

    1 全局搜索 2 提供了一个 Services tree 的API接口显示窗口 右侧会有RestServices侧边栏 点击后会显示当前项目所有请求地址 可以进行输入查询 然后会直接把请求方式 地址以及参数列出来 默认请求服务器为本机 lo
  • 【python】socket-传输多个文件、大文件

    socket 传输多个文件 大文件 0 前言 1 发送单个文件流程 2 关于发送大文件 本地读取时报错 MemoryError 3 关于粘包 问题背景 排错过程 解决方案 4 备注 换算表 0 前言 看过挺多个发文件的例子 但是基本都是发单
  • 每日博客 :>

    1 交换数组 define CRT SECURE NO WARNINGS 1 include
  • 计算机网络34-学习笔记-IP地址

    IP地址属于网络层 这里主要介绍IP地址作用 与MAC地址配合 主机H1将数据包发送给路由器R1 在网络层封装的IP数据报首部中 源IP地址应填写主机H1的IP地址IP1 目的IP地址应填写主机H2的IP地址IP2 在数据链路层中源MAC地
  • python装饰器

    装饰器是python一个重要的部分 由它的名称我们就可以大致了解到它的功能 拓展其他函数 装饰器可以让我们的代码更加简洁 也更加pythonic 首先 我们先回顾一下基础概念 一 在python中 如果调用一个函数不带括号时 调用的是这个函
  • R语言多任务处理与并行运算包——foreach

    作者简介Introduction 杜雨 EasyCharts团队成员 R语言中文社区专栏作者 兴趣方向为 Excel商务图表 R语言数据可视化 地理信息数据可视化 个人公众号 数据小魔方 微信ID datamofang 数据小魔方 创始人