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 基础教程之Map使用方法
Jan 17 Python
Python常用算法学习基础教程
Apr 13 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
对pandas中Series的map函数详解
Jul 25 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 Python
基于python制作简易版学生信息管理系统
Apr 20 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获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
学习php开源项目的源码指南
2014/12/21 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
php中数组最简单的使用方法
2020/12/27 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
jquery 手势密码插件
2017/03/17 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
戴尔美国官网:Dell
2016/08/31 全球购物
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
建筑项目策划书
2014/01/13 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
无罪辩护词范文
2015/05/21 职场文书
2016新年问候语大全
2015/11/11 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
MySQL学习之基础命令实操总结
2022/03/19 MySQL