Python数据预处理:使用Dask和Numba并行化加速

摘要: 本文是针对Python设计一种并行处理数据的解决方案——使用Dask和Numba并行化加速运算速度。案例对比分析了几种不同方法的运算速度,非常直观,可供参考。

如果你善于使Pandas变换数据、创建特征以及清洗数据等,那么你能够轻松地使用Dask和Numba并行加速你的工作。单纯从速度上比较,Dask完胜Python,而Numba打败Dask,那么Numba+Dask基本上是无敌的存在。将数值计算分成Numba sub-function和使用Dask map_partition+apply,而不使用Pandas。对于100万行数据,使用Pandas方法和混合数值计算创建新特征的速度比使用Numba+Dask方法的速度许多倍。

Python:60.9x | Dask:8.4x | Numba:5.8x |Numba+Dask:1x


作为旧金山大学的一名数据科学硕士,会经常跟数据打交道。使用Apply函数是我用来创建新特征或清理数据的众多技巧之一。现在,我只是一名数据科学家,而不是计算机科学方面的专家,但我是一个喜欢捣鼓并使得代码运行更快的程序员。现在,我将会分享我在并行应用上的经验。

大多Python爱好者可能了解Python实现的全局解释器锁(GIL),GIL占用计算机中所有的CPU性能。更糟糕的是,我们主要的数据处理包,比如Pandas,很少能实现并行处理代码。

Apply函数vs Multiprocessing.map


%time df.some_col.apply(lambda x : clean_transform_kthx(x))
Wall time: HAH! RIP BUDDY
# WHY YOU NO RUN IN PARALLEL!?


Tidyverse已经为处理数据做了一些美好的事情,Plyr是我最喜爱的数据包之一,它允许R语言使用者轻松地并行化他们的数据应用。Hadley Wickham说过:

“plyr是一套处理一组问题的工具:需要把一个大的数据结构分解成一些均匀的数据块,之后对每一数据块应用一个函数,最后将所有结果组合在一起。”

对于Python而言,我希望有类似于plyr这样的数据包可供使用。然而,目前这样的数据包还不存在,但我可以使用并行数据包构成一个简单的解决方案

Dask


之前在Spark上花费了一些时间,因此当我开始使用Dask时,还是比较容易地掌握其重点内容。Dask被设计成能够在多核CPU上并行处理任务,此外借鉴了许多Pandas的语法规则。

现在开始本文所举例子对于最近的数据挑战而言,我试图获取一个外部数据源(包含许多地理编码点),并将其与要分析的一大堆街区相匹配。在计算欧几里得距离的同时,使用最大启发式将最大值分配给一个街区。


最初的apply:


my_df.apply(lambda x: nearest_street(x.lat,x.lon),axis=1)


Dask apply:

dd.from_pandas(my_df,npartitions=nCores).\map_partitions(\lambda df : df.apply(\lambda x : nearest_street(x.lat,x.lon),axis=1)).\compute(get=get)
# imports at the end


二者看起来很相似,apply核心语句map_partitions,最后有一个compute()语句。此外,不得不npartitions初始化。 分区的工作原理就是将Pandas数据帧划分成块,对于我的电脑而言,配置是6核-12线程,我只需告诉它使用的是12分区,Dask就会完成的工作。

接下来,将map_partitions的lambda函数应用于每个分区。由于许多数据处理代码都是独立地运行,所以不必过多地担心这些操作的顺序问题。最后,compute()函数告诉Dask来处理剩余的事情,并把最终计算结果反馈给我。在这里,compute()调用Dask将apply适用于每个分区,并使其并行处理。

由于我通过迭代行来生成一个新队列(特征),而Dask apply只在列上起作用,因此我没有使用Dask apply,以下是Dask程序:


from dask import dataframe as dd
from dask.multiprocessing import get
from multiprocessing import cpu_count
nCores = cpu_count()



NumbaNumpyBroadcasting

由于我是根据一些简单的线性运算(基本上是勾股定理)对数据进行分类,所以认为使用类似下面的Python代码会运行得更快一些。


for i in intersections:l3 = np.sqrt( (i[0] - [1])**2 + (i[2] - i[3])**2 )
# ... Some more of thesedist = l1 + l2if dist < (l3 * 1.2):matches.append(dist)
# ... More stuff
### you get the idea, there's a for-loop checking to see if
### my points are close to my streets and then returning
closest
### I even used numpy, that means fast right?


Broadcasting用以描述Numpy中对两个形状不同的矩阵进行数学计算的处理机制。假设我有一个数组,我会通过迭代并逐个变换每个单元格来改变它

# over one array
for cell in array:cell * CONSTANT - CONSTANT2
# over two arrays
for i in range(len(array)):array[i] = array[i] + array2[i]

相反,我完全可以跳过for循环,并对整个数组执行操作。Numpy与broadcasting混合使用,用来执行元素智能乘积(对位相乘)

# over one array
(array * CONSTANT) - CONSTANT2
# over two arrays of same length
# different lengths follow broadcasting rules
array = array - array2


Broadcasting可以实现更多的功能,现在看看骨架代码:

from numba import jit
@jit # numba magic
def some_func()l3_arr = np.sqrt( (intersections[:,0] -
intersections[:,1])**2 +\(intersections[:,2] -
intersections[:,3])**2 )
# now l3 is an array containing all of my block lengths
# likewise, l1 and l2 are now equal sized arrays
# containing distance of point to all intersectionsdist = l1_arr + l2_arrmatch_arr = dist < (l3_arr * 1.2)
# so instead of iterating, I just immediately compare all
of my
# point-to-street distances at once and have a handy
# boolean index


从本质上讲,代码的功能是改变数组。好的一方面是运行很快,甚至能和Dask并行处理速度比较。其次,如果使用的是最基本的Numpy和Python,那么就可以及时编译任何函数。坏的一面在于它只适合Numpy和简单Python语法。我不得不把所有的数值计算从我的函数转换成子函数,但计算速度增加得非常快。

将其一起使用

简单地使用map_partition()就可以将Numba函数与Dask结合在一起,如果并行操作和broadcasting能够密切合作以加快运行速度,那么对于大数据集而言,将会看到运行速度得到大幅提升。



上面的第一张图表明,没有broadcasting的线性计算其表现不佳,并行处理和Dask对速度提升也有效果。此外,可以明显地发现,Dask和Numba组合的性能优于其它方法。

上面的第二张图稍微有些复杂,其横坐标是对行数取对数。从第二张图可以发现,对于1k到10k这样小的数据集,单独使用Numba的性能要比联合使用Numba+Dask的性能更好,尽管在大数据集上Numba+Dask的性能非常好。

优化

为了能够使用Numba编译JIT,我重写了函数以更好地利用broadcasting。之后,重新运行这些函数后发现,平均而言,对于相同的代码,JIT的执行速度大约快了24%。


可以肯定的说,一定有进一步的优化方法使得执行速度更快,但目前没有发现。Dask是一个非常友好的工具,本文使用Dask+Numba实现的最好成果是提升运行速度60倍。如果你知道其它的提升执行速度的技巧,欢迎在留言区分享。


文章原标题《Data Pre-Processing in Python: How I learned to love parallelized applies with Dask and Numba》,

作者:Ernest Kim,译者:海棠,审阅:袁虎。

原文链接

干货好文,请关注扫描以下二维码:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作流实战_12_flowable 流程实例 终止流程

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public ReturnVo&l…

让运维更高效:关于ECS系统事件

摘要&#xff1a; 阿里云会针对ECS实例发布系统事件&#xff0c;当您收到阿里云计划维护的通知时&#xff0c;可以利用ECS系统计划事件了解与实例相关的计划维护操作&#xff0c;并根据您的业务特性选择合适的时间安排运维操作进行故障转移&#xff0c;减少对系统可靠性和业务连…

工作流实战_13_flowable 待办任务列表查询

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 这里我使用的sql查…

openlayer xyz加载_webGIS实践:3_1_openlayer展绘点线面注记

上一篇已经讲了&#xff0c;怎么加载瓦片地图。这篇就看看怎么简单的渲染矢量点线面数据。最简单的&#xff0c;绘制点线面注记。效果长这样&#xff1a;新建一个文件FeatureOL.HTML。代码如下&#xff1a;<!DOCTYPE html> <html lang"en"> <head>…

反转了!“只问了1个框架,就给了35K的Python岗”

Python还有“敌人”吗&#xff1f;最近网络上一则帖子吸引了笔者&#xff0c;大意内容为&#xff1a;据说A是有2年多经验的Python工程师&#xff0c;面一个公司相关的岗位&#xff0c;由于人手紧缺&#xff0c;所以只问了一个框架&#xff0c;就按笔者提的35K办理了入职。&…

用深度学习解决Bongard问题

摘要&#xff1a; 本文介绍了深度学习和Bongard问题&#xff0c;以及如何用深度学习更好的解决Bongard问题。Bongard问题是苏联计算机科学家Mikhail Bongard提出的。从20世纪60年代&#xff0c;他致力于研究模式识别&#xff0c;并且设计了100个这样的谜题&#xff0c;使之成为…

使用Jenkins+Sonarqueb进行自动化测试和代码质量检测

摘要&#xff1a; Jenkins Jenkins是一款开源的持续集成工具&#xff0c;它的特点&#xff1a;易于安装、易于配置、可扩展&#xff08;自己开发插件&#xff09;&#xff0c;并且它拥有数以百计的成熟插件&#xff0c;这种插件式的特点提供可做任何事情的可能。 简介 Jenkins …

工作流实战_15_flowable 我发起的流程实例查询

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示![在这里插入图片描述](https://img-blog.csdnimg.cn…

Istio 庖丁解牛六:多集群网格应用场景

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 钟华来源 | ServiceMesher随着容器技术的流行&#xff0c;大量互联网公司和传统 IT 企业都在尝试应用容器化和服务上云。容器化是一个持续的过程&#xff0c;伴随着多地域部署、安全等级隔离、多云和混合云等复杂的场景需求。…

NAT网关之SNAT进阶使用(一)SNAT POOL

摘要&#xff1a; NAT网关是云上VPC ECS访问Internet的出入口。SNAT可实现指定的VPC ECS使用指定的公网IP访问互联网。阿里云NAT网关控制台创建SNAT条目时&#xff0c;默认是为指定的交换机配置1个公网IP地址。 &#xff08;一&#xff09;前言 为什么使用SNAT POOL NAT网关是云…

工作流实战_16_flowable 办理任务

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public ReturnVo&l…

OpenStack精华问答 | OpenStack的网络类型有哪些?

戳蓝字“CSDN云计算”关注我们哦&#xff01;关于OpenStack的探讨几乎从未间断&#xff0c;从2010年10月份一个版本正式发布至今&#xff0c;OpenStack在8年发展历程中&#xff0c;成为了最有争议的那一个。今天&#xff0c;我们就来看看有关于OpenStack的精华问答吧1Q&#xf…

秘籍分享:SLB实例克隆

摘要&#xff1a; 秘籍分享&#xff1a;SLB实例的备份与克隆 1. Greetings :) Hi&#xff0c;大家好&#xff0c;2018年春节刚过不久&#xff0c;想必大家一定觉得假期短暂&#xff0c;没有玩爽吧&#xff0c;但我们IT民工的命就是这么苦逼&#xff0c;想想也只能撸起袖子使劲干…

工作流实战_08_flowable 流程实例的启动

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示1. 演示 ### 2. 代码 public ReturnVo<ProcessI…

SD-WAN新价值:中企通信与Fortinet强强联合 安全先行

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹当前&#xff0c;云计算、大数据、人工智能等数字技术方兴未艾&#xff0c;全球正快速进入数字经济时代&#xff0c;企业数字化转型的浪潮已经到来。与此同时&#xff0c;企业数字化转型也带动了一系列技术与应用&#x…

人工智能开发人员需要具备技能

摘要&#xff1a; 对于那些想要从事人工智能项目的开发人员来说&#xff0c;他们需要具备哪些必要的技能&#xff1f;对于那些想要从事人工智能项目的开发人员来说&#xff0c;他们需要具备哪些必要的技能&#xff1f;我们就这个问题采访了22位相关企业的高管&#xff0c;以下就…

rubymine 保存成unix格式_如何免费在线试用 200+ Linux 和 Unix 发行版?

☞ 程序员进阶架构师必备资源免费送 ☜Linux 和 Unix 都有着各种各样的发行版&#xff0c;有的界面美观&#xff0c;有的功能强大。如果你想要尝试不同的 Linux 和 Unix 发行版&#xff0c;传统的作法是先在本地安装对应版本&#xff0c;再进行体验。这样效率非常低下&#xff…

WPF使用prism框架进行页面跳转

首先下载prism.dryloc框架 创建两个文件夹&#xff0c;Views和ViewModels文件夹&#xff0c;在Views里面创建的是页面&#xff0c;在Viewmodels里面创建的是对 应的类&#xff0c;文件不能创建错误 在App.xaml.cs中将App修改成PrismApplication&#xff0c;创建App的CreateShe…

每个产品经理都应该知道的机器学习术语

摘要&#xff1a; 公司正在上马AI项目&#xff1f;想要熟悉机器学习的世界&#xff0c;想要了解所有关于机器学习的术语&#xff0c;看看本文吧&#xff01;公司正在上马AI项目&#xff1f;或许你已经熟悉了机器学习的世界&#xff0c;但是仍然希望扩展你的知识面&#xff0c;并…

工作流实战_22_flowable 驳回/回退 并行网关驳回 多实例驳回 子流程驳回

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://www.bilibili.com/video/av78779999/ 用户名密码0000001test0000002test0000003test0000004test文章目录1. 场景2. 演示3. 代码分享3.1. 获取可驳回节点3.2. 驳回代码分享1. 场景 驳回&…