0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

pandarallel模块怎么用

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 15:37 次阅读

众所周知,由于GIL的存在,Python单进程中的所有操作都是在一个CPU核上进行的,所以为了提高运行速度,我们一般会采用多进程的方式。而多进程无非就是以下几种方案:

  • multiprocessing
  • concurrent.futures.ProcessPoolExecutor()
  • joblib
  • ppserver
  • celery

这些方案对于普通Pandas玩家来说都不是特别友好,怎样才能算作一个友好的并行处理方案?

那就是原来的逻辑我基本不用变,仅修改需要计算的那行就能完成我们目标的方案,而 pandarallel 就是一个这样友好的工具。

没有并行计算(原始pandas)

pandarallel

df.apply(func)

df.parallel_apply(func)

df.applymap(func)

df.parallel_applymap(func)

df.groupby(args).apply(func)

df.groupby(args).parallel_apply(func)

df.groupby(args1).col_name.rolling(args2).apply(func)

df.groupby(args1).col_name.rolling(args2).parallel_apply(func)

df.groupby(args1).col_name.expanding(args2).apply(func)

df.groupby(args1).col_name.expanding(args2).parallel_apply(func)

series.map(func)

series.parallel_map(func)

series.apply(func)

series.parallel_apply(func)

series.rolling(args).apply(func)

series.rolling(args).parallel_apply(func)

可以看到,在 pandarallel 的世界里,你只需要替换原有的 pandas 处理语句就能实现多CPU并行计算。非常方便、非常nice.

图片

在4核CPU的性能测试上,它比原始语句快了接近4倍。测试条件(OS: Linux Ubuntu 16.04,Hardware: Intel Core i7 @ 3.40 GHz - 4 cores),这就是我所说的,它把CPU充分利用了起来。

下面就给大家介绍这个模块怎么用,其实非常简单,任何代码只需要加几行代码就能实现质的飞跃。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖

  1. Windows 环境 打开 Cmd (开始-运行-CMD)。
  2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
  3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install pandarallel

对于windows用户,有一个不好的消息是,它只能在Windows的linux子系统上运行(WSL),你可以在微软官网上找到安装教程

https://docs.microsoft.com/zh-cn/windows/wsl/about

2.使用Pandarallel

使用前,需要对Pandarallel进行初始化:

from pandarallel import pandarallel
pandarallel.initialize()

这样才能调用并行计算的API,不过 initialize 中有一个重要参数需要说明,那就是 nb_workers ,它将指定并行计算的Worker数,如果没有设置,所有CPU的核都会用上。

Pandarallel一共支持8种Pandas操作,下面是一个apply方法的例子。

import pandas as pd
import time
import math
import numpy as np
from pandarallel import pandarallel

# 初始化
pandarallel.initialize()
df_size = int(5e6)
df = pd.DataFrame(dict(a=np.random.randint(1, 8, df_size),
                       b=np.random.rand(df_size)))
def func(x):
    return math.sin(x.a**2) + math.sin(x.b**2)

# 正常处理
res = df.apply(func, axis=1)

# 并行处理
res_parallel = df.parallel_apply(func, axis=1)

# 查看结果是否相同
res.equals(res_parallel)

其他方法使用上也是类似的,在原始的函数名称前加上 parallel_,比如 DataFrame.groupby.apply:

import pandas as pd
import time
import math
import numpy as np
from pandarallel import pandarallel

# 初始化
pandarallel.initialize()
df_size = int(3e7)
df = pd.DataFrame(dict(a=np.random.randint(1, 1000, df_size),
                       b=np.random.rand(df_size)))
def func(df):
    dum = 0
    for item in df.b:
        dum += math.log10(math.sqrt(math.exp(item**2)))
        
    return dum / len(df.b)

# 正常处理
res = df.groupby("a").apply(func)
# 并行处理
res_parallel = df.groupby("a").parallel_apply(func)
res.equals(res_parallel)

又比如 DataFrame.groupby.rolling.apply:

import pandas as pd
import time
import math
import numpy as np
from pandarallel import pandarallel

# 初始化
pandarallel.initialize()
df_size = int(1e6)
df = pd.DataFrame(dict(a=np.random.randint(1, 300, df_size),
                       b=np.random.rand(df_size)))
def func(x):
    return x.iloc[0] + x.iloc[1] ** 2 + x.iloc[2] ** 3 + x.iloc[3] ** 4

# 正常处理
res = df.groupby('a').b.rolling(4).apply(func, raw=False)
# 并行处理
res_parallel = df.groupby('a').b.rolling(4).parallel_apply(func, raw=False)
res.equals(res_parallel)

案例都是类似的,这里就直接列出表格,不浪费大家宝贵的时间去阅读一些重复的例子了:

没有并行计算(原始pandas)

pandarallel

df.apply(func)

df.parallel_apply(func)

df.applymap(func)

df.parallel_applymap(func)

df.groupby(args).apply(func)

df.groupby(args).parallel_apply(func)

df.groupby(args1).col_name.rolling(args2).apply(func)

df.groupby(args1).col_name.rolling(args2).parallel_apply(func)

df.groupby(args1).col_name.expanding(args2).apply(func)

df.groupby(args1).col_name.expanding(args2).parallel_apply(func)

series.map(func)

series.parallel_map(func)

series.apply(func)

series.parallel_apply(func)

series.rolling(args).apply(func)

series.rolling(args).parallel_apply(func)

3.注意事项

1. 我有 8 个 CPU,但 parallel_apply 只能加快大约4倍的计算速度。为什么?

答:正如我前面所言,Python中每个进程占用一个核,Pandarallel 最多只能加快到你所拥有的核心的总数,一个 4 核的超线程 CPU 将向操作系统显示 8 个 CPU,但实际上只有 4 个核心,因此最多加快4倍。

2. 并行化是有成本的(实例化新进程,通过共享内存发送数据,...),所以只有当并行化的计算量足够大时,并行化才是有意义的。对于很少量的数据,使用 Pandarallel 并不总是值得的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2694

    浏览量

    47426
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10851

    浏览量

    211529
收藏 人收藏

    评论

    相关推荐

    电力电子集成模块平板型热管基板的传热特性

    电力电子集成模块平板型热管基板的传热特性:摘要:为了解决集成模块中面临的热集中和热影响问题,提高模块的热扩散能力,并实现模块热管理集成,本
    发表于 10-14 12:26 28次下载

    LED模块直流或交流电子控制装置特殊要求

    LED模块直流或交
    发表于 12-21 15:58 19次下载

    普通照明LED和LED模块术语和定义

    1 范围本标准规定了普通照明LED 和LED 模块及相关的术语和定义。本标准适用于编写有关普通照明LED 的各类标准及其有关的技术文献。2 犔犈犇和犔
    发表于 12-22 16:23 0次下载

    普通照明LED模块测试方法

    本标准规定了普通照明LED模块的基本性能的测量方法。 本标准适用于功率大于或等于1W,在恒定电压、恒定电流或恒定功率下稳定工作的、外置控制的LED模块;以及采用直流250V以下或
    发表于 04-14 14:35 33次下载

    照明白色LED模块

    通过将LED(发光二极管)应用于照明,实现约相当于灯泡(60型)3倍的发光效率 高光束 通过多个LED芯片的高密度安装,达到400流明的照明高光束白色LED模块。 长寿命 通过LED的采用,
    发表于 04-15 15:01 20次下载

    IGBT模块低热阻陶瓷覆铜板的制作研究

    IGBT模块低热阻陶瓷覆铜板的制作研究
    发表于 02-28 23:12 3次下载

    GPS模块介绍 无人机上的GPS模块

    GPS模块介绍 无人机上的GPS模块,本文档介绍了无人机上的GPS模块的一些基本情况,希望给大家做个参考
    发表于 11-10 17:31 27次下载

    隆达推出最新车LED矩阵式光源模块 将打造更安全的路环境

    继2018年发表一系列LED车灯模块后,近日,LED垂直整合厂隆达再推出最新车LED矩阵式光源模块,可侦测对向来车并调整头灯照射区域,也可投射动态讯息于行车道路上,打造更安全的路环
    发表于 03-20 15:26 1519次阅读

    PXI仪模块的实现与针对EMC应采取的措施

    重点描述了PXI仪模块必须具有的PCI/PXI总线接口、精密时基和触发控制器的实现,最后探讨了PXI仪模块针对EMC应采取的措施。实际应用表明所设计的PXI仪
    发表于 04-13 09:12 1955次阅读
    PXI仪<b class='flag-5'>用</b><b class='flag-5'>模块</b>的实现与针对EMC应采取的措施

    IGBT模块封装及车变流器设计与验证

    IGBT模块封装及车变流器设计与验证说明。
    发表于 05-19 14:52 40次下载

    什么是无线串口模块?无线串口模块怎么

    常看到很多网友在百度知道,天涯问答,搜搜问问等问答平台上提问什么是无线串口模块,无线串口模块怎么等等这样的问题。可能是刚接触这个行业的人想了解这样的产品才会产生疑问,思为无线针对这个问题为大家解答。
    的头像 发表于 08-04 14:01 5843次阅读
    什么是无线串口<b class='flag-5'>模块</b>?无线串口<b class='flag-5'>模块</b>怎么<b class='flag-5'>用</b>?

    电子模块的电源设计

    电子发烧友网站提供《电子模块的电源设计.doc》资料免费下载
    发表于 11-15 09:57 0次下载
    电子<b class='flag-5'>模块</b><b class='flag-5'>用</b>的电源设计

    激光测距模块的工作原理 激光测距模块怎么 激光测距方法有哪几种

    激光测距模块的工作原理 激光测距模块怎么 激光测距方法有哪几种  激光测距模块,也称为激光测距仪或激光测距装置,是一种利用激光技术测量目标距离的设备。它通常由激光发射器、接收器、时钟
    的头像 发表于 01-03 15:59 1832次阅读

    如何检测电源模块的好坏 万表测试输出电压 示波器测试电源模块的输出波形

    如何检测电源模块的好坏 万表测试输出电压 示波器测试电源模块的输出波形 要测试电源模块是否好坏,可以采取以下的步骤: 检查电源线连接:确保电源线连接正确,没有损坏或松动。 使用万
    的头像 发表于 02-05 10:33 1057次阅读

    光学模块BAW隔离器解决方案应用简介

    电子发烧友网站提供《光学模块BAW隔离器解决方案应用简介.pdf》资料免费下载
    发表于 09-09 14:51 0次下载
    光学<b class='flag-5'>模块</b><b class='flag-5'>用</b>BAW隔离器解决方案应用简介