你还在用Pandas处理大量数据?我发现了一个省时省事的工具:Dask
itomcoil 2025-01-04 20:23 27 浏览
Pandas不具有多处理支持,并且对于较大的数据集来说,速度非常慢。 现在有一个更好的工具可以使这些CPU内核正常工作!
在性数据分析方面,Pandas是最好的工具之一。但这并不意味着它适用于所有任务(比如说大数据处理)。在日常的工作中,我们往往要花很长时间等待Pandas读取文件或等待计算结果。
最近,我发现了一个新工具,能快速处理大量的数据,比如读取多个包含10G数据的文件,对它们应用过滤器并进行聚合。当我完成繁重的处理后,我将结果保存到一个较小的“pandas-friendly”CSV文件中,并继续在pandas中进行探索性数据分析。
本文中的例子将在Jupyter Notebook中进行演示,还没安装的同学记得先安装好。
认识Dask
Dask为数据分析提供了高级并行性,从而为你喜欢的工具提供了大规模的性能。 其中包括numpy,pandas和sklearn, Dask是开源而且免费的, 它使用现有的Python API和数据结构来简化在Dask支持的等效项之间切换。
Dask能让简单的事情变得更加容易,也能让复杂的事情变成有可能。
Pandas vs Dask
在我的日常工作中,经常需要分析一大堆文件,我来模拟一下每天的工作:创建10个包含10万个条目的文件(每个文件有196 MB)。
from sklearn.datasets import make_classification
import pandas as pd
for i in range(1, 11):
print('Generating trainset %d' % i)
x, y = make_classification(n_samples=100_000, n_features=100)
df = pd.DataFrame(data=x)
df['y'] = y
df.to_csv('trainset_%d.csv' % i, index=False)
现在,让我们用Pandas读取这些文件并估算时间,Pandas没有本地的glob支持,因此我们需要循环读取文件。
%%time
import glob
df_list = []
for filename in glob.glob('trainset_*.csv'):
df_ = pd.read_csv(filename)
df_list.append(df_)
df = pd.concat(df_list)
df.shape
Pandas花了16秒读取文件。
CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s
现在我们可以想象一下,如果这些文件再多100倍的话:可能连Pandas都看不懂了!
Dask可以通过将数据分成块并指定任务链来处理不适合内存的数据,我们可以估算一下Dask需要多长时间来加载这些文件。
import dask.dataframe as dd
%%time
df = dd.read_csv('trainset_*.csv')
CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms
Dask仅需154毫秒,用时这么短?这是因为Dask执行了延迟模式,它会在需要的时候执行计算。我们需要先定义执行图,这样Dask就可以根据任务来优化执行。我们来重复一下这个实验,Dask的read-csv函数以glob为本机函数。
%%time
df = dd.read_csv('trainset_*.csv').compute()
CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s
compute函数会强制Dask返回结果,这样Dask读取文件速度就是Pandas的两倍!
Dask能在本地对Python进行扩展。
Pandas与Dask的CPU使用率
让我们在读取文件时比较pandas和Dask之间的CPU使用情况:代码与上面相同。
上图可以看出,pandas和Dask在读取文件时在多处理方面的差异非常明显。
背后发生了什么?
Dask的数据帧由多个pandas数据帧组成,这些数据帧按索引进行拆分。当我们用Dask执行read_csv时,多个进程读取一个文件。
我们可以来可视化执行图。
exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()
Dask的缺点
你可能会想,如果Dask这么牛,为什么不一起抛弃Pandas。 当然不可能那么简单,只有来自pandas的某些功能才能移植到Dask上执行。有一些很难并行化,例如排序值和在未排序的列上设置索引。 Dask不是灵丹妙药-仅在不适合主存储器的数据集上,才建议使用Dask。 由于Dask是建立在Pandas之上的,因此Pandas响应速度慢,而Dask则行动缓慢。 就像我之前提到的,Dask是数据管道过程中的有用工具,但它不能替代其他库。
建议只对不适合主内存的数据集使用Dask。
如何安装Dask?
要安装Dask,只需运行:
python -m pip install "dask[complete]"
一行代码就能安装整个Dask库。
最后
在这篇文章中只触及了Dask库的表面知识。如果你想更深入地了解Dask,应该去学习Dask教程DataFrame文档。
--END--
欢迎大家关注我们的公众号:为AI呐喊(weainahan)
找工作一定少不了项目实战经验,为了帮助更多缺少项目实战的同学入门Python,我们在头条上创建了一个专栏:《7小时快速掌握Pthon核心编程》,通过一个项目,快速掌握Python,欢迎大家点击链接或者阅读原文进行试看~
相关推荐
- selenium(WEB自动化工具)
-
定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...
- 开发利器丨如何使用ELK设计微服务中的日志收集方案?
-
【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...
- 高并发系统设计:应对每秒数万QPS的架构策略
-
当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...
- 2025 年每个 JavaScript 开发者都应该了解的功能
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...
- JavaScript Array 对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战
-
刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...
- 动力节点最新JavaScript教程(高级篇),深入学习JavaScript
-
JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...
- 一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code
-
当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...
- 「晚安·好梦」努力只能及格,拼命才能优秀
-
欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...
- JavaScript 中 some 与 every 方法的区别是什么?
-
大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...
- 10个高效的Python爬虫框架,你用过几个?
-
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...
- 12个高效的Python爬虫框架,你用过几个?
-
实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...
- pip3 install pyspider报错问题解决
-
运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...
- PySpider框架的使用
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 「机器学习」神经网络的激活函数、并通过python实现激活函数
-
神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)