Python提高运行速度工具之Pandarallel的使用教程

 更新时间:2022年09月27日 11:37:12   作者:我爱Python数据挖掘  
为了提高运行速度,我们一般会采用多进程的方式。而常见的方案对于普通python玩家来说都不是特别友好,怎样才能算作一个友好的并行处理方案?本文就来和大家讲讲pandarallel的使用

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

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

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

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

可以看到,在 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已经成功安装在电脑上

pip install pandarallel

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)

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

3.注意事项

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

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

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

到此这篇关于Python提高运行速度工具之Pandarallel的使用教程的文章就介绍到这了,更多相关Python Pandarallel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python matplotlib seaborn绘图教程详解

    Python matplotlib seaborn绘图教程详解

    Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图。本文将详细讲解如何利用Seaborn绘制图表,需要的可以参考一下
    2022-03-03
  • springboot整合单机缓存ehcache的实现

    springboot整合单机缓存ehcache的实现

    本文主要介绍了springboot整合单机缓存ehcache的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python实现准确获取PDF文件中的标题

    Python实现准确获取PDF文件中的标题

    想要在PDF文件中,解析获取全部的标题,是一件比较麻烦的事情,这篇文章将介绍一种较为准确的提取标题的方式,感兴趣的小伙伴可以了解一下
    2024-02-02
  • VSCode运行或调试python文件无反应的问题解决

    VSCode运行或调试python文件无反应的问题解决

    这篇文章主要给大家介绍了关于VSCode运行或调试python文件无反应的问题解决,使用VScode编译运行C/C++没有问题,但是运行Python的时候出了问题,所以这里给大家总结下,需要的朋友可以参考下
    2023-07-07
  • 基于Python编写端口进程管理工具

    基于Python编写端口进程管理工具

    这篇文章主要为大家介绍了如何使用Python编写一个用于端口管理和进程管理的GUI工具,它可以显示当前系统上所有开放的端口信息,感兴趣的可以了解下
    2025-01-01
  • Python图像分割之均匀性度量法分析

    Python图像分割之均匀性度量法分析

    均匀性度量图像分割是图像像素分割的一种方法,当然还有其他很多的方法。本文将主要介绍下其原理和实现代码,感兴趣的小伙伴可以学习一下
    2021-12-12
  • python 决策树算法的实现

    python 决策树算法的实现

    这篇文章主要介绍了python 决策树算法的实现,帮助大家更好的理解和使用python 机器学习算法,感兴趣的朋友可以了解下
    2020-10-10
  • Python : turtle色彩控制实例详解

    Python : turtle色彩控制实例详解

    今天小编就为大家分享一篇Python : turtle色彩控制实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python网络编程之进程详解

    python网络编程之进程详解

    这篇文章主要为大家介绍了python网络编程之进程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Python random模块的运用详解

    Python random模块的运用详解

    这篇文章主要为大家介绍了Python random模块的运用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12

最新评论