我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何解决R语言循环慢的问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何解决R语言循环慢的问题

小编给大家分享一下如何解决R语言循环慢的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

什么是R语言

R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。

step1

先查下自己电脑几核的,n核貌似应该选跑n个线程,线程不是越多越好,线程个数和任务运行时间是条开口向下的抛物线,最高点预计在电脑的核数上。

detectCores( )检查当前电脑可用核数 我的是4所以step2选的是4

library(parallel)cl.cores <- detectCores()

step 2

多线程计算

setwd("C:\\Users\\siyuanmao\\Documents\\imdada\\0-渠道投放和新人券联动模型\\测算")options(scipen=3)  ##取消科学计数法channel_ad_ios_data<-seq(0,50000,5000)channel_ad_android_data<-seq(0,100000,10000)library(parallel)func <- function(n){#n=1  result_data<-read.csv("发券方案.csv",stringsAsFactors=FALSE)  total_coupon_solution_data<-read.csv("结果表框架.csv",stringsAsFactors=FALSE)  coupon_solution_data<-subset(result_data,solution== paste('方案',n,sep=""))    for (i in 1:11){#i=3    coupon_solution_data$channel_ad_cost[3]<-5000*(i-1)        for (j in 1:11){#j=5      coupon_solution_data$channel_ad_cost[4]<-10000*(j-1)      solution_mark<-paste('方案',n,i,j,sep="-")      coupon_solution_data$solution<-solution_mark            total_coupon_solution_data<-rbind(total_coupon_solution_data,coupon_solution_data)    }  }  print(solution_mark)  return(total_coupon_solution_data)}#func(10)system.time({x <- 1:7776cl <- makeCluster(4) # 初始化四核心集群results <- parLapply(cl,x,func) # lapply的并行版本res.df <- do.call('rbind',results) # 整合结果stopCluster(cl) # 关闭集群})df=as.data.frame(res.df)

原来非多线程的时候,我预计要跑12个小时以上,电脑发出呼呼~~的响声,查了下Python循环会快点,然后改为python版(已经很久没有用了,连个range都不会写,摸索了大半天才改好,但是速度还是慢==),于是改成多线程,运行25分钟就出结果了~~

补充:R语言 多线程

parallel包

包的安装

install.packages("parallel")library(parallel)

包中常用函数

detectCores() 检查当前的可用核数

clusterExport() 配置当前环境

makeCluster() 分配核数

stopCluster() 关闭集群

parLapply() lapply()函数的并行版本

其实R语言本来就是一门向量化语言,如果是对于一个向量的操作,使用apply函数一族能获得比较高的效率,相比于for循环,这种高效来自于:

用C实现了for循环

减少对于data.frame等数据结构等不必要的拷贝

但是很多时候,如果想更快的话,光apply函数一族还不足够,这时候就能用上多线程。

R语言parallel包可以帮助实现多线程。

parLapply的简单代码实战

检查当前核数

cl.cores <- detectCores()#结果> cl.cores[1] 8

启动集群和关闭集群

cl <- makeCluster(4) # 初始化四核心集群###并行任务stopCluster(cl) # 关闭集群

parLapply执行多线程计算

#定义计算平方函数square <- function(x){    return(x^2)}
#利用并行计算计算平方函数num <- c(1:3)cl <- makeCluster(4) # 初始化四核心集群results <- parLapply(cl,num,square)#调用parLapply并行计算平方函数final <- do.call('c',results)#整合结果stopCluster(cl) # 关闭集群#结果> final[1] 1,4,9

思考:在如此小的计算方式下,开4个核计算是否比开一个核要快

答案:当然是不一定,因为涉及到调度方式等额外开销,所以不一定快,因为真正并行起作用的地方在于大数据量的计算。

时间开销对比

两段对比代码

#定义计算平方函数square <- function(x){   #########   #一段冗余代码增加执行时间    y = 2*x    if(y <300)    {z = y}    else    {z = x}   ##########       return(x^2)}num <- c(1:10000000)
#并行计算print(system.time({    cl <- makeCluster(4) # 初始化四核心集群    results <- parLapply(cl,num,square)#调用parLapply并行计算平方函数final <- do.call('c',results)#整合结果stopCluster(cl) # 关闭集群}))#结果用户  系统  流逝  7.89  0.27 19.01
#普通计算print(system.time({    results <- lapply(num,square)    final <- do.call('c',results)#整合结果}))#结果用户  系统  流逝 29.74  0.00 29.79

显然在数据量比较大的时候,并行计算的时间几乎就是于核数反比。不过,也不是多开几个核就好,注意内存很容易超支的,每个核都分配相应的内存,所以要注意内存开销。出现内存问题的时候,需要检查是否代码是否合理,R语言版本(64位会比32位分配的内存大),核分配是否合理。

上一级环境中变量的引入

R语言里边对于环境变量有着有趣的定义,一层套一层,这里不做深入展开。

类似于在c语言函数中使用全局变量,R在执行并行计算的时候,如果需要计算的函数出现在全局(上一级),那么就需要声明引入这个变量,否则将会报错。

#定义计算幂函数base = 2square <- function(x){    return(x^base)}num <- c(1:1000000)
#利用并行计算计算幂函数cl <- makeCluster(4) # 初始化四核心集群results <- parLapply(cl,num,square)#调用parLapply并行计算平方函数final <- do.call('c',results)#整合结果stopCluster(cl) # 关闭集群#结果报错Error in checkForRemoteErrors(val) :   4 nodes produced errors; first error: 找不到对象'base'
#利用并行计算计算幂函数cl <- makeCluster(4) # 初始化四核心集群clusterExport(cl,"base",envir = environment())results <- parLapply(cl,num,square)#调用parLapply并行计算平方函数final <- do.call('c',results)#整合结果stopCluster(cl) # 关闭集群#结果> final[1] 1,4,9,16,25.......

foreach包

除了parallel包以外,还有针对并行for循环的foreach包,foreach()的使用也与parLapply()类似,两个功能也类似,其中遇到的问题也类似。

包的安装

install.packages("foreach")library(parallel)

foreach的使用

#定义计算幂函数square <- function(x){    return(x^2)}

非并行情况的使用:

参数中的combine就是整合结果的函数,可以是c,可以是rbind,也可以是+等

results = foreach(x = c(1:3),.combine = 'c') %do% square(x)#结果> results[1] 1,4,9

并行情况的使用:

注意并行情况的时候,需要与parallel包进行配合,引入library(doParallel)。同时%do%需要改成%dopar%。另外与parallel包不一样的是,需要多加一句registerDoParallel(cl)来注册核进行使用。

cl <- makeCluster(4)registerDoParallel(cl)results = foreach(x = c(1:100000),.combine = 'c') %dopar% square(x)stopCluster(cl)

上一级环境中变量的引入

同parallel包并行计算前需要clusterExport()来引入全局变量一样,foreach也同样需要声明,不同的是,foreach声明方式直接写在foreach()的参数export里边。

#定义计算幂函数base = 2square <- function(x){    return(x^base)}cl <- makeCluster(4)registerDoParallel(cl)results = foreach(x = c(1:100000),.combine = 'c',.export ='base' ) %dopar% square(x)stopCluster(cl)

看完了这篇文章,相信你对“如何解决R语言循环慢的问题”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何解决R语言循环慢的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何解决R语言循环慢的问题

小编给大家分享一下如何解决R语言循环慢的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计
2023-06-14

如何解决C语言中for循环问题

本篇内容主要讲解“如何解决C语言中for循环问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决C语言中for循环问题”吧!今天分享一下C语言中的for循环中我们常常忽略的小问题。举一个小
2023-06-07

java-for循环问题如何解决

这篇文章主要介绍了java-for循环问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java-for循环问题如何解决文章都会有所收获,下面我们一起来看看吧。for循环for循环语句是支持迭代的一种通
2023-07-05

如何使用R语言替换for循环

这篇文章将为大家详细讲解有关如何使用R语言替换for循环,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。R语言中,for循环运行比较慢for(i in 1:1000){print(i^2)}补
2023-06-14

R语言如何解决无法打开链结的问题

这篇文章给大家分享的是有关R语言如何解决无法打开链结的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。近期,在项目中遇到一个棘手的问题。R脚本在centos服务器上通过"R --no-save filename
2023-06-14

如何解决Java循环依赖的问题

今天就跟大家聊聊有关如何解决Java循环依赖的问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。最近看到一个问题:如果有两个类A和B,A类中有一个B的对象b,B类中有一个A的对象a,
2023-06-02

spring循环依赖问题如何解决

本篇内容介绍了“spring循环依赖问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、三种循环依赖的情况①构造器的循环依赖:这种
2023-07-02

ubuntu循环登录问题如何解决

这篇文章主要介绍“ubuntu循环登录问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ubuntu循环登录问题如何解决”文章能帮助大家解决问题。解决ubuntu循环登录的方法:1.在终端查
2023-07-04

maven循环依赖问题如何解决

Maven循环依赖问题可以通过以下几种方式解决:1. 重新设计项目结构:循环依赖通常是由于项目结构设计不合理引起的。可以重新考虑项目的模块划分,将相关的功能模块放在同一个模块下,减少模块之间的依赖关系。2. 提取公共模块:如果多个模块之间存
2023-09-17

如何解决Spring循环依赖问题

本文小编为大家详细介绍“如何解决Spring循环依赖问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何解决Spring循环依赖问题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。公共代码package com
2023-07-02

springbean循环依赖问题如何解决

Spring框架可以通过使用构造函数注入和setter方法注入两种方式来解决循环依赖问题。1. 构造函数注入:在循环依赖的类中,通过构造函数注入依赖的类,而不是使用@Autowired注解进行属性注入。这样可以确保在创建对象时,所有的依赖都
2023-09-29

R语言中循环的相关知识详解

这篇文章主要为大家详细介绍了R语言中循环的相关知识,文中的示例代码讲解详细,对我们学习R语言有一定的帮助,感兴趣的可以了解一下
2023-03-19

C语言数组越界引发的死循环问题解决

本文主要介绍了C语言数组越界引发的死循环问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

python中的循环结构问题如何解决

这篇文章主要讲解了“python中的循环结构问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的循环结构问题如何解决”吧!python循环结构Python中循环结构有两
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录