pandas apply多线程实现代码


Posted in Python onAugust 17, 2020

一、多线程化选择

     并行化一个代码有两大选择:multithread 和 multiprocess。

     Multithread,多线程,同一个进程(process)可以开启多个线程执行计算。每个线程代表了一个 CPU 核心,这么多线程可以访问同样的内存地址(所谓共享内存),实现了线程之间的通讯,算是最简单的并行模型。

    Multiprocess,多进程,则相当于同时开启多个 Python 解释器,每个解释器有自己独有的数据,自然不会有数据冲突。

二、并行化思想

并行化的基本思路是把 dataframe 用 np.array_split 方法切割成多个子 dataframe。再调用 Pool.map 函数并行地执行。注意到顺序执行的 pandas.DataFrame.apply 是如何转化成 Pool.map 然后并行执行的。

Pool 对象是一组并行的进程,开源Pool类

开源Pool类定义

def Pool(self, processes=None, initializer=None, initargs=(),
       maxtasksperchild=None):
    '''Returns a process pool object'''
    from .pool import Pool
    return Pool(processes, initializer, initargs, maxtasksperchild,
          context=self.get_context())

设置进程初始化函数

def init_process(global_vars):
  global a
  a = global_vars

设置进程初始化函数

Pool(processes=8,initializer=init_process,initargs=(a,))

其中,指定产生 8 个进程,每个进程的初始化需运行 init_process函数,其参数为一个 singleton tuple a. 利用 init_process 和 initargs,我们可以方便的设定需要在进程间共享的全局变量(这里是 a)。

with 关键词是 context manager,避免写很繁琐的处理开关进程的逻辑。

with Pool(processes=8,initializer=init_process,initargs=(a,)) as pool:    
    result_parts = pool.map(apply_f,df_parts)

三、多线程化应用

多线程时间比较和多线程的几种apply应用

import numpy as np
import pandas as pd
import time
from multiprocessing import Pool

def f(row):
  #直接对某列进行操作
  return sum(row)+a

def f1_1(row):
  #对某一列进行操作,我这里的columns=range(0,2),此处是对第0列进行操作
  return row[0]**2

def f1_2(row1):
  #对某一列进行操作,我这里的columns=range(0,2),此处是对第0列进行操作
  return row1**2

def f2_1(row):
  #对某两列进行操作,我这里的columns=range(0,2),此处是对第0,2列进行操作
  return pd.Series([row[0]**2,row[1]**2],index=['1_1','1_2'])

def f2_2(row1,row2):
  #对某两列进行操作,我这里的columns=range(0,2),此处是对第0,2列进行操作
  return pd.Series([row1**2,row2**2],index=['2_1','2_2'])

def apply_f(df):
  return df.apply(f,axis=1)

def apply_f1_1(df):
  return df.apply(f1_1,axis=1)

def apply_f1_2(df):
  return df[0].apply(f1_2)

def apply_f2_1(df):
  return df.apply(f2_1,axis=1)

def apply_f2_2(df):
  return df.apply(lambda row :f2_2(row[0],row[1]),axis=1)
 
def init_process(global_vars):
  global a
  a = global_vars
  
def time_compare():
  '''直接调用和多线程调用时间对比'''
  a = 2
  np.random.seed(0)
  df = pd.DataFrame(np.random.rand(10**5,2),columns=range(0,2))
  print(df.columns)
   
  t1= time.time()
  result_serial = df.apply(f,axis=1)
  t2 = time.time()
  print("Serial time =",t2-t1)
  print(result_serial.head())

  
  df_parts=np.array_split(df,20)
  print(len(df_parts),type(df_parts[0]))
  with Pool(processes=8,initializer=init_process,initargs=(a,)) as pool: 
  #with Pool(processes=8) as pool:    
    result_parts = pool.map(apply_f,df_parts)
  result_parallel= pd.concat(result_parts)
  t3 = time.time()
  print("Parallel time =",t3-t2)
  print(result_parallel.head())


def apply_fun():
  '''多种apply函数的调用'''
  a = 2
  np.random.seed(0)
  df = pd.DataFrame(np.random.rand(10**5,2),columns=range(0,2))
  print(df.columns)
  df_parts=np.array_split(df,20)
  print(len(df_parts),type(df_parts[0]))
  with Pool(processes=8,initializer=init_process,initargs=(a,)) as pool: 
  #with Pool(processes=8) as pool:    
    res_part0 = pool.map(apply_f,df_parts)
    res_part1 = pool.map(apply_f1_1,df_parts)
    res_part2 = pool.map(apply_f1_2,df_parts)
    res_part3 = pool.map(apply_f2_1,df_parts)
    res_part4 = pool.map(apply_f2_2,df_parts)

  res_parallel0 = pd.concat(res_part0)
  res_parallel1 = pd.concat(res_part1)
  res_parallel2 = pd.concat(res_part2)
  res_parallel3 = pd.concat(res_part3)
  res_parallel4 = pd.concat(res_part4)
  
  print("f:\n",res_parallel0.head())
  print("f1:\n",res_parallel1.head())
  print("f2:\n",res_parallel2.head())
  print("f3:\n",res_parallel3.head())
  print("f4:\n",res_parallel4.head())

  df=pd.concat([df,res_parallel0],axis=1)
  df=pd.concat([df,res_parallel1],axis=1)
  df=pd.concat([df,res_parallel2],axis=1)
  df=pd.concat([df,res_parallel3],axis=1)
  df=pd.concat([df,res_parallel4],axis=1)

  print(df.head())
      
  
if __name__ == '__main__':
  time_compare()
  apply_fun()

参考网址

https://blog.fangzhou.me/posts/20170702-python-parallelism/

https://docs.python.org/3.7/library/multiprocessing.html

到此这篇关于pandas apply多线程实现代码的文章就介绍到这了,更多相关pandas apply多线程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python从入门到精通(DAY 2)
Dec 20 Python
Python正则表达式常用函数总结
Jun 24 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
python可视化爬虫界面之天气查询
Jul 03 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
Python缓存技术实现过程详解
Sep 25 Python
django数据模型中null和blank的区别说明
Sep 02 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
简述python Scrapy框架
Aug 17 #Python
python使用多线程查询数据库的实现示例
Aug 17 #Python
python使用建议与技巧分享(一)
Aug 17 #Python
Python2.6版本pip安装步骤解析
Aug 17 #Python
python中pathlib模块的基本用法与总结
Aug 17 #Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 #Python
详解python datetime模块
Aug 17 #Python
You might like
php懒人函数 自动添加数据
2011/06/28 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
python with statement 进行文件操作指南
2014/08/22 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
python实现杨氏矩阵查找
2019/03/02 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
Java程序员面试题
2016/09/27 面试题
庆元旦迎新年广播稿
2014/02/18 职场文书
核心价值观演讲稿
2014/05/13 职场文书
2014年师德承诺书
2014/05/23 职场文书
学校食堂管理制度
2015/08/04 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Python django中如何使用restful框架
2021/06/23 Python
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
pandas中对文本类型数据的处理小结
2021/11/01 Python
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android