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和Perl绘制中国北京跑步地图的方法
Mar 03 Python
python魔法方法-属性访问控制详解
Jul 25 Python
使用Python写CUDA程序的方法
Mar 27 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
python networkx 根据图的权重画图实现
Jul 10 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
django 模型中的计算字段实例
May 19 Python
python 操作excel表格的方法
Dec 05 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
使用python向MongoDB插入时间字段的操作
May 18 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
Javascript 类型转换方法
2010/10/24 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
解析Python的缩进规则的使用
2019/01/16 Python
python实现的生成word文档功能示例
2019/08/23 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
Python控制台实现交互式环境执行
2020/06/09 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
某同学的自我鉴定范文
2013/12/26 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
工作求职信
2014/07/04 职场文书
售房协议书
2014/08/19 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
人力资源部工作计划
2019/05/14 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
Android存储中最基本的文件存储方式
2022/04/30 Java/Android