▎作者:Manu NALEPA
▎编译:公众号翻译部
本文中介绍的库只支持Linux和MacOS。
安装文件文末下载
什么问题困扰着我们?
对于Pandas,当你运行以下代码行时:
df
即使你的计算机有多个CPU,也只有一个CPU是完全用于计算的。
我们希望用一种简单的方法来代替CPU的使用:
Pandaral·lel如何解决这个问题?
Pandaral·lel的理念是将Pandas计算分配到计算机上所有可用的CPU上,以获得显著的速度提升。
▍安装
$
▍初始化
# Import
▍用法
对于一个带有Pandas DataFrame df的简单用例和一个应用func的函数,只需用parallel_apply替换经典的apply。
# Standard pandas apply
注意,如果不想并行化计算,仍然可以使用经典的apply方法。
你还可以通过在initialize函数中传递progress_bar=True来显示每个工作CPU的一个进度条。
在一个更加复杂的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
标准 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一个列名:
具体如何操作的?
调用parallel_apply时,Pandaral·lel:
- 实例化Pyarrow Plasma shared memory。
- 为每个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环境下高效并行Pandasmp.weixin.qq.com—End—
量化投资与机器学习微信公众号,是业内垂直于Quant、MFE、CST等专业的主流自媒体。公众号拥有来自公募、私募、券商、银行、海外等众多圈内10W+关注者。每日发布行业前沿研究成果和最新资讯。