有哪些让人相见恨晚的Python库(一)
对于我这个经常用python倒腾数据的人来说,下面这个库是真·相见恨晚
记得有一次我在服务器上处理数据时,为了解决Pandas读取超过2000W条数据就内存爆炸的问题,整整用了两天时间来优化。最后通过数据转换,数据类型,迭代读取和GC机制解决了(具体方法在我的博客:Python优化之使用pandas读取和训练千万级数据)
我一直觉得python处理大规模数据是真的不行,除非上Hadoop。直到我看到了一个叫Modin的库,才知道什么叫一行代码,解决所有问题。
先说说为啥pandas这么不好用
Pandas 是Python中常用的程序库,计算机、数据科学领域的应该都经常用。本身它是个高性能、易于使用的数据结构和数据分析工具,可以说非常新手友好了。但是当数据量一旦变大时,单个内核上运行的 Pandas 就会变得力不从心,毕竟现在企业级数据单日数据量可能都是GB或者TB数量级,可能会需要分布式系统来提高性能。在默认设置下,Pandas只使用单个CPU内核,在单进程模式下运行函数,相比之下Tensorflow只需要设置GPU参数就可以多核并行了。
速度慢并不会影响小型数据,我们甚至可能都不会注意到速度的变化。但对于计算量庞大的数据集来说,仅使用单内核会导致运行速度非常缓慢。有些数据集可能有百万条甚至上亿条数据,如果每次都只进行一次运算,只用一个CPU,速度会很慢。
绝大多数现代电脑都有至少两个CPU。但即便是有两个CPU,使用pandas时,受默认设置所限,一半甚至以上的电脑处理能力无法发挥。如果是4核(现代英特尔i5芯片)或者6核(现代英特尔i7芯片),就更浪费了。Pandas本就不是为了高效利用电脑计算能力而设计的。

所以从我们只是想让 Pandas 运行得更快,而不是为了特定的硬件设置而优化其工作流。这意味着我们希望在处理 10KB 的数据集时,可以使用与处理 10TB 数据集时相同的 Pandas 脚本。Modin 提供了一个优化 Pandas 的解决方案,这样数据科学工作者就可以把时间花在从数据中提取价值上,而不是花在提取数据的工具上。
啥是Modin?
Modin 是加州大学伯克利分校 RISELab 的一个早期项目,旨在促进分布式计算在数据科学领域的应用。它是一个多进程的数据帧(Dataframe)库,具有与 Pandas 相同的应用程序接口(API),使用户可以加速他们的 Pandas 工作流。
它是一个多进程的数据帧(Dataframe)库,具有与 Pandas 相同的应用程序接口(API),使用户可以加速他们的 Pandas 工作流。据相关实验表明,在一台 8 核的机器上,用户只需要修改一行代码,Modin 就能将 Pandas 查询任务加速 4 倍。
在Pandas中,给定DataFrame,目标是尽可能以最快速度来进行数据处理。可以使用.mean()来算出每行的平均数,用groupby将数据分类,用drop_duplicates()来删除重复项,还有很多Pandas的其他内置函数以供使用。

之前提到,Pandas只调用一个CPU来进行数据处理。这是一个很大的瓶颈,特别是对体量更大的DataFrames,资源的缺失更加突出。
理论上来讲,并行计算就如同在所有可用CPU内核中的不同数据点中计算一样简单。之于Pandas DataFrame,一个基本想法就是根据不同的CPU内核数量将DataFrame分成几个不同部分,让每个核单独计算。最后再将结果相加,这在计算层面来讲,运行成本比较低。
如何提高多核系统数据处理速度。在单核系统处理过程中(左),所有10个任务都用一个CPU处理。而在双核系统中(右),每个节点处理5个任务,处理速度提高一倍。
这其实也就是Modin的原理,将 DataFrame分割成不同的部分,而每个部分由发送给不同的CPU处理。Modin可以切割DataFrame的横列和纵列,任何形状的DataFrames都能平行处理。

假如拿到的是很有多列但只有几行的DataFrame。一些只能对列进行切割的库,在这个例子中很难发挥效用,因为列比行多。但是由于Modin从两个维度同时切割,对任何形状的DataFrames来说,这个平行结构效率都非常高。不管有多少行,多少列,或者两者都很多,它都能游刃有余地处理。
Pandas DataFrame(左)作为整体储存,只交给一个CPU处理。ModinDataFrame(右)行和列都被切割,每个部分交给不同CPU处理,有多少CPU就能处理多少个任务。
上述图像只是一个简单的例子。Modin通常会用到一个分盘助手(Partition Manager),它能根据操作的种类改变分盘的大小和形状。比如说,可能需要一整行或者一整列(数据)的操作。在这种情况下,分盘助手就能对任务进行切割,再分别交给不同的CPU处理,从而找到任务处理的最优解,灵活方便。

在并行处理时,Modin会从Dask或者Ray工具中任选一个来处理繁杂的数据,这两个工具都是PythonAPI的平行运算库,在运行Modin的时候可以任选一个。目前为止,Ray应该最为安全且最稳定。Dask后端还处在测试阶段。
该系统是为希望程序运行得更快、伸缩性更好,而无需进行重大代码更改的 Pandas 用户设计的。这项工作的最终目标是能够在云环境中使用 Pandas。
读取800M文件、以及对其进行各种PD操作速度对比

Modin 项目仍处于早期阶段,但对 Pandas 来说是一个非常有发展前景的补充库。Modin 为用户处理所有的数据分区和重组任务,这样我们就可以集中精力处理工作流。Modin 的基本目标是让用户能够在小数据和大数据上使用相同的工具,而不用考虑改变 API 来适应不同的数据规模。
在这个示例中,我们通过使用Modin,读取这个800M文件大约节省了22秒,相当于节省了74%的时间。试想一下如果有100个这样的文件需要读取,光读取文件就可以节省半个小时的时间。
安装方法
pip install 大法(记得装RAY)
使用方法
import modin.pandas as pd
更多python技能、机器学习、AI知识,欢迎关注我的公众号「图灵的猫」,后台回复SSR有机场节点相送哦~
有哪些让人相见恨晚的Python库(一)的更多相关文章
- 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库
我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...
- 推荐一些相见恨晚的 Python 库 「一」
扯淡 首先说明下,这篇文章篇幅过长并且大部分是链接,因此非常适合在电脑端打开访问. 本文内容摘自 Github 上有名的 Awesome Python.这是由 vinta 在 14 年发起并持续维护的 ...
- 哪些 Python 库让你相见恨晚?
知乎用户,A European Swallow. 苇叶.Aran He.jerry等人赞同 补充三个有助于自动化日常工作的: sh:sh 1.08 — sh v1.08 documentation可以 ...
- 哪些 Python 库让你相见恨晚?【转】
原文链接:https://www.zhihu.com/question/24590883/answer/92420471 原文链接:Python 资源大全 ---------------- 这又是一个 ...
- Python库,让你相见恨晚的第三方库
环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具.pyenv – 简单的 Python 版本管理工具.Vex – 可以在虚拟环境中执行命令.virt ...
- 【转】【Python学习】之哪些 Python 库让你相见恨晚?
感谢作者:赖明星 文章链接地址:<哪些 Python 库让你相见恨晚?>
- python 库资源大全
偶然的机会翻到这篇文章,很全面,来源: Python 资源大全中文版 哪些 Python 库让你相见恨晚? 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 pyth ...
- 11个并不广为人知,但值得了解的Python库
这是一篇译文,文中提及了一些不常见但是有用的Python库 原文地址:http://blog.yhathq.com/posts/11-python-libraries-you-might-not-kn ...
- python自动化测试(4)-使用第三方python库技术实现
python自动化测试(4)-使用第三方python库技术实现 1 概述 关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 ...
随机推荐
- codeforces 609C
#include<bits/stdc++.h> using namespace std; ],c[]; int main() { int n,i; while(cin >> n ...
- pytorch中如何处理RNN输入变长序列padding
一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练 ...
- Python--day41--递归锁Rlock
1,递归锁Rlock:递归锁是为了解决死锁问题,且递归锁的特点是在同一个线程中可以被acquire()多次 多个acquire()在递归锁中不会阻塞,而互斥锁Lock就会阻塞 代码示例: from t ...
- P1028 过河问题
题目描述 为了躲避黑暗大魔王的追杀,zifeiy与他的伙伴们共N人连夜逃出了黑暗城堡,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T ...
- vue-learning:28 - component - 组件事件的修饰符`.native / .sync`,以及组件属性`model`
组件事件的修饰符.native / .sync,以及组件属性model .native 原生事件修饰符 在一个组件中,如果我们为其绑定一个原生的点击事件@click,基本是无效的. 在vue中对组件绑 ...
- LuoguP3521 [POI2011]ROT-Tree Rotations
P3521 [POI2011]ROT-Tree Rotations 题目大意: 给一棵\((1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 我们发现 ...
- Codeforces 293E 点分治+cdq
Codeforces 293E 传送门:https://codeforces.com/contest/293/problem/E 题意: 给你一颗边权一开始为0的树,然后给你n-1次操作,每次给边加上 ...
- To learns
1. avro https://www.jianshu.com/p/ecbb607809c4
- git之分支
分支相互之间互不干扰 1.小乌龟创建分支,切换/检出 创建后直接切换到该分支,另一个需要再切换一下. 2.点击这个可以看到所有的分支,进行删除操作. 3.在fen1,fen2分别进行操作更新,互不 ...
- ML基础——搜索引擎与图书管理,百度与李彦宏
本文始发于个人公众号:TechFlow 谈及机器学习,大家想必会有许多联想,比如最近火热的人工智能,再比如战胜李世石的AlphaGo,甚至还会有人联想起骇客帝国或者是机械公敌等经典机器人电影. 但实际 ...