没有使用
Pandarallel

使用了
Pandarallel

众所周知,由于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.准备

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 = 0for 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 并不总是值得的。

-------- End --------
图解Pandas图文00-内容框架介绍图文01-数据结构介绍图文02-创建数据对象图文03-操作Excel文件图文04-常见的数据访问图文05-常见的数据运算图文06-常见的数学计算图文07-常见的数据统计图文08-常见的数据筛选图文09-常见的缺失值处理图文10-数据合并操作

Pandarallel 一个能让 pandas 计算火力拉满的工具相关推荐

  1. Pandarallel:一款能让你的 Python 计算火力拉满的工具

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

  2. python计算csv文件内的数据_Python利用pandas计算多个CSV文件数据值的实例

    功能:扫描当前目录下所有CSV文件并对其中文件进行统计,输出统计值到CSV文件 pip install pandas import pandas as pd import glob,os,sys in ...

  3. 详解c语言欧拉函数,【基础数论】十分钟学会计算欧拉函数

    欧拉函数 欢迎各位读者指出不足,谢谢~ 首先我们要知道欧拉函数是个什么东东? 废话不多说~欧拉函数就是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 欧拉函数的通式: ...

  4. python pandas 条件求和_python 使用pandas计算累积求和的方法

    python 使用pandas计算累积求和的方法 使用pandas下的cumsum函数 cumsum:计算轴向元素累积加和,返回由中间结果组成的数组.重点就是返回值是"由中间结果组成的数组& ...

  5. 面试美团,完全实况30+面试真题与答案公布。不得不说细节拉满想要拿到一个大厂offer还真不容易。

    面试美团,完全实况30+面试真题与答案公布.不得不说细节拉满想要拿到一个大厂offer还真不容易. 叮.....美团来电.这次不是外卖而是电话面试. Java 后端开发的. 如果你问我,看了这些题就完 ...

  6. python使用pandas计算dataframe中每个分组的分位数极差、分组数据的分位数极差(range)、使用groupby函数和agg函数计算分组的两个分位数

    python使用pandas计算dataframe中每个分组的分位数极差.分组数据的分位数极差(range).使用groupby函数和agg函数计算分组的两个分位数 目录

  7. python使用pandas计算dataframe中每个分组的极差、分组数据的极差(range)、使用groupby函数和agg函数计算分组的最大值和最小值

    python使用pandas计算dataframe中每个分组的极差.分组数据的极差(range).使用groupby函数和agg函数计算分组的最大值和最小值 目录

  8. pandas读取多个文件内容为dataframe、并合并为一个dataframe、pandas创建仅有列标签而内容为空的dataframe

    pandas读取多个文件内容为dataframe.并合并为一个dataframe.pandas创建仅有列标签而内容为空的dataframe 目录

  9. pandas计算dataframe两列数据值相等的行号、取出DataFrame中两列值相等的行号

    pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号 目录 pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号

最新文章

  1. VUE -- Mac上解决Chrome浏览器跨域问题
  2. 永洪Desktop全能力永久免费 国产数据分析工具迈向新阶段
  3. 汤普森算法_火箭队闹剧不断!自编算法向NBA申诉:这个公式要在NBA普及!
  4. 邮件联系人,如何恕不部分字母就能显示邮件联系人
  5. 英伟达RTX 3080值不值得抢?在TensorFlow上训练了卷积网络
  6. 从零开始学前端: HTML框架和VS Code安装 --- 今天你学习了吗?(CSS:Day01)
  7. [zz]linux之sed用法
  8. aoi服务器图标删除后怎么找回,Windows10系统桌面图标被误删了如何找回【图文教程】...
  9. python写字典_用python编写字典并将其写入HDF5-fi
  10. python微信商城_python微信商城_GitHub - pythonsir/nideshop: NideShop 开源微信小程序商城服务端(Node.js + ThinkJS)......
  11. Java 安全套接字编程以及keytool 使用最佳实践
  12. 光伏逆变器设计资料,原理图,PCB,源代码 DC-DC采用Boost升压,DCAC采用全桥逆变电路结构
  13. eclipse背景设置绿豆色
  14. 乐视x820android最新版本,乐视MAX2|MIUI10|安卓8.1|最终完美版|极速_最新最全的乐Max2ROM刷机包下载、刷机教程_...
  15. Java中的statis用法
  16. RFID资产管理系统解决方案
  17. Kafka常用命令收录
  18. java p12 ssl_从 p12 格式 SSL 证书解出 pem 格式公钥私钥给 Postman 使用
  19. R语言(三)——多重共线性情况(岭回归、[适应性]lasso回归、偏最小二乘回归)
  20. 虚拟机dhcp服务器,虚拟机dhcp服务器配置

热门文章

  1. 20201204 - 姥爷走了
  2. Activity Diagram(活动图)几个重要节点
  3. Volatile和Synchronized四个不同点:
  4. 叮咚买菜拟IPO背后:烧钱难见回报,下一个ofo小黄车?
  5. 浅述非结构化数据与非结构化处理
  6. TCP原理篇之连接耗尽攻击异常报文攻击
  7. matlab 立体图平面化法,matlab绘制三维立体图
  8. 如何实现马尔可夫链蒙特卡罗MCMC模型、Metropolis算法?
  9. 【stm32 IAP-APP跳转学习记录】代码少一“点“,调试大半天
  10. 【上电即上华为云】华为云smart智联PLC_NB-IoT_BLE无线网关_plc_3121N-IED_BC95-CNV