pandas apply lambda_干货 | 如何用一行代码在多CPU环境下高效并行Pandas

f42ae06c187acf23280f3eeb8e835d0d.png

▎作者:Manu NALEPA

编译:公众号翻译部

本文中介绍的库只支持LinuxMacOS

安装文件文末下载

c27c79a91562e064eb989a6f8b9c234c.png

什么问题困扰着我们?

对于Pandas,当你运行以下代码行时:

df

0180844a77268ed4af8b4bee0e563240.gif
只使用一个CPU

即使你的计算机有多个CPU,也只有一个CPU是完全用于计算的。

我们希望用一种简单的方法来代替CPU的使用:

fe471f624dd346fbf7b7ea7509e8edaf.gif
所有CPU齐上阵

Pandaral·lel如何解决这个问题?

Pandaral·lel的理念是将Pandas计算分配到计算机上所有可用的CPU上,以获得显著的速度提升。

▍安装

$ 

▍初始化

# Import

▍用法

对于一个带有Pandas DataFrame df的简单用例和一个应用func的函数,只需用parallel_apply替换经典的apply。

# Standard pandas apply

注意,如果不想并行化计算,仍然可以使用经典的apply方法。

7983e8dd9e4f3986228e375273ad1bc6.gif

你还可以通过在initialize函数中传递progress_bar=True来显示每个工作CPU的一个进度条。

1b241c585e1ae331253c4bfbfa432433.gif

在一个更加复杂的Pandas DataFrame df用例中,DataFrame column1和column2的两列,以及一个函数用于func:

# Standard pandas apply

基准

以下是其中四个例子的配置:

  • 操作系统:Linux Ubuntu 16.04
  • 硬件:Intel Core i7 @ 3.40 GHz - 4核
%

▍DataFrame.apply

f_size 

▍DataFrame.applymap

df_size 

▍DataFrame.groupby.apply

df_size 

▍DataFrame.groupby.rolling.apply

df_size 

6c6483bbaa589525ede3c6b625f3a0f6.png

标准 vs 并行四核(越低越好)

除了df.groupby.col_name.rolling。如果应用程序的速度只增加了x3.2倍,那么平均速度就会增加大约x4倍,即使用的计算机上的内核数量。

▍Series.map

df_size 

▍Series.apply

df_size 

▍Series.rolling.apply

df_size 

警告

1、进度条是一项实验性功能。这可能导致相当大的性能损失。parallel_apply不能用于DataFrameGroupy.parallel_apply。

2、使用df一个Pandas DataFrame,series 一个 Pandas Series,func一个函数来应用/ map,args1,args2一些参数&col_name一个列名:

04de78c82a56fb89a8b7f18e3c02b35a.png

fe872c04263f7cfe961916b0b7778f4b.png

具体如何操作的?

调用parallel_apply时,Pandaral·lel:

  • 实例化Pyarrow Plasma shared memory。
The Plasma In-Memory Object Store​arrow.apache.org
  • 为每个CPU创建一个子进程,并要求每个CPU处理DataFrame的一个子部分。
  • 在父进程中组合所有结果。

与其他进程间通信媒介相比,使用共享内存的主要优点是不存在序列化/反序列化,这可能会导致CPU开销过大。

警告

1、并行化是有条件的(实现新进程,通过共享内存发送数据等等),所以只有当并行化的计算量足够高时,并行化才有效。对于很少的数据,使用parallezation并不总是有效的。

2、应用的函数不应该是lambda函数。

from 

问题排除

我有8个CPU,但是 parallel_apply 只加快了大约x4的计算速度。为什么?

实际上,Pandarallel 只能加快计算速度,直到你计算机有大约核心的数量。最近大多数CPU(如Intel core-i7)都使用超线程。例如,一个4核的超线程CPU将向操作系统显示8个CPU,但实际上只有4个物理计算单元。

在Ubuntu上,你可以用如下获得内核的数量:

$ grep - m1 'cpu core ' /proc/cpuinfo.

当我运行如下时:

from pandarallel import pandarallel

我得到:

ModuleNotFoundError: No module named 'pyarrow._plasma。

为什么?

目前,Pyarrow Plasma只在Linux和macOS上工作(不支持Windows)

如何获取代码

干货 | 如何用一行代码在多CPU环境下高效并行Pandas​mp.weixin.qq.com
882a09debed141d5bae1619c4088012f.png

—End—

量化投资与机器学习微信公众号,是业内垂直于QuantMFECST等专业的主流自媒体。公众号拥有来自公募、私募、券商、银行、海外等众多圈内10W+关注者。每日发布行业前沿研究成果和最新资讯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值