用它做Python并行数据分析,隔壁程序猿都馋哭了

2023-12-29 06:32

本文主要是介绍用它做Python并行数据分析,隔壁程序猿都馋哭了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有时候你在做 Python 数据分析的时候,可能会出现这么个情况:用 Pandas 打开一个超大型数据集,想得到一些度量(metrics),然后就尴尬地卡住了。

大家都知道,如果你处理大数据,手里用的是 Pandas,有时要等上一小时才能得到一个 Series 的平均值,甚至都还没调用 apply 函数。这还只是几百万行啊,如果是几十亿行,那最好还是用 Spark 之类的高级工具吧。

更多Python视频、源码、资料加群683380553免费获取

那么就没有好办法了吗?有的,就有这么一个工具,能够加速 Python 数据分析,既不需要你使用配置更高的硬件设施,也不必切换编程语言。当然,如果你的数据集超级超级大,它的最终作用也会有限,但比普通的 Python 扩展工具好多了。特别是如果你不用做大量的重建索引,那么这个工具非常适合你。

用它做Python并行数据分析,隔壁程序猿都馋哭了

 

这个工具叫 Dask,数据科学家 Luciano Strika 专门试用了这个工具,并做了测试,发现 Dask 在做并行数据分析时,比常规 Pandas 快出许多倍。

什么是Dask?

Dask 是一个开源项目,能提供 NumPy Arrays,Pandas Dataframes 和常规列表的抽象,允许你使用多核处理并行运行它们。

下面这段直接摘自教程:

Dask 提供模仿了 NumPy,列表和 Pandas 的高级 Array,Bag 以及 DataFrame 集合,但能够在无法放入主内存的数据集上并行运行。对大型数据集来说,Dask 的高级集合是 NumPy 和 Pandas 的替代方案。

听起来真不错!于是我(作者Luciano Strika)决定亲自试试 Dask Dataframes,并对它们进行了几个基准测试。

阅读文档

我首先阅读了官方文档,看看建议我们使用 Dask 做哪些工作。以下是官方文档(docs.dask.org/en/latest)中的相关部分:

  • 操纵大型数据集,即使这些数据集无法放入内存
  • 使用许多核来加速长计算
  • 使用标准Pandas操作(如 groupby,join 和时间序列计算)对大型数据集进行分布式计算

然后在下面,它列出了一些如果使用 Dask Dataframes 会快速完成的事情:

  • 算术运算(乘以或添加到Series)
  • 常见聚合(平均值,最小值,最大值,求和等)
  • 调用 apply(只要它在索引中,也就是说,不是在 groupby('y')之后'y'不是索引)
  • 调用 value_counts(),drop_duplicates()或corr()
  • 使用 loc,isin 和行式选择进行过滤

用它做Python并行数据分析,隔壁程序猿都馋哭了

 

如何使用 Dask Dataframes

Dask Dataframes 与 Pandas Dataframes 具有相同的 API,只是聚合和 apply 函数延迟执行,并且需要通过调用 compute 方法来计算。要想生成 Dask Dataframe,可以像在 Pandas 中一样调用 read_csv 方法,或者,如果给出 Pandas Dataframe df,只需调用

dd = ddf.from_pandas(df, npartitions=N)

其中 ddf 是你导入 Dask Dataframes 的名称,而 npartitions 是一个参数,告诉 Dataframe 如何对其进行分区。

根据 StackOverflow 上的说法,建议将 Dataframe 划分为与计算机核数数量相同的分区,或者是该数量的几倍,因为每个分区将在不同的线程上运行。如果分区过多,它们之间的通信代价会高很多。

动手吧:做点基准测试

我写了一个 Jupyter notebook 试用这个框架,在 GitHub 上能看到,可以自己运行一下:github.com/StrikingLoo/

我运行的基准测试可以在 Github 上的 Jupyter notebook 中找到,主要有以下要点:

用它做Python并行数据分析,隔壁程序猿都馋哭了

 

这里df3是一个常规的 Pandas Dataframe,拥有 2500 万行,使用这段脚本生成,其中列是名称,姓氏和薪水,从列表中随机抽样。我用了一个有 50 行的数据集并连接了 500000 次,因为我对分析本身并不太感兴趣,但运行它时才会。

dfn 就是基于 df3 的 Dask Dataframe。

第一批结果:不太乐观

我首先尝试使用 3 个分区进行测试,因为我的电脑只有 4 个内核,不想过度使用它。这次使用 Dask 的结果非常差,而且还要等很久才能得到结果,不过我怀疑这可能是分区过少的原因:

用它做Python并行数据分析,隔壁程序猿都馋哭了

 

可以看到在我使用 Dask 时大多数操作变慢了很多。这给了我一些启示,可能必须使用更多分区才行。产生延迟计算所花的成本也可以忽略不计(在某些情况下不到半秒),所以如果重复使用它,成本不会随着时间推移而摊销。

我还用 apply 方法尝试了这个测试:

用它做Python并行数据分析,隔壁程序猿都馋哭了

 

并有非常相似的结果:

用它做Python并行数据分析,隔壁程序猿都馋哭了

 

因此,一般来说,大多数操作的速度都是初始操作的两倍,尽管过滤器的速度要快得多。我觉得或许应该在上面调用 compute,所以对这个结果持保留态度。

更多分区:加速惊人

得到前面这些不尽人意的结果之后,我决定我可能只是没有使用足够的分区。毕竟,整件事情的重点是并行运行,所以或许我只需进一步并行化?所以我尝试了 8 个分区的相同测试,得到了如下结果(省略了非并行数据帧的结果,因为它们基本相同):

用它做Python并行数据分析,隔壁程序猿都馋哭了

 

这就对了!大多数操作的运行速度比常规 Dataframe 快十倍,甚至 apply 的运行速度也更快了!我还运行了 value_count 测试,它只调用“薪水”Series 上的 value_count 方法。对于上下文,在我足足等 10 分钟后在常规 Dataframe 上运行此测试时,必须终止该过程。这次只用了 50 秒!

所以之前都没用对工具,它的速度可比常规 Dataframe 快多了。

最后再说一点

鉴于我是在一台相当旧的 4 核 PC 上运行了 2500 万行数据,所以是相当了不起的。所以我的建议是,下回你必须在本地或从单个 AWS 实例上理数据集时,一定要试试 Dask 这个框架。运行速度简直不要太快。

这篇关于用它做Python并行数据分析,隔壁程序猿都馋哭了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548630

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主