InfoQ 编辑部出品——2021年度技术盘点与展望 了解详情
写点什么

仅用几行代码,让 Python 函数执行快 30 倍

  • 2021 年 8 月 04 日
  • 本文字数:1884 字

    阅读完需:约 6 分钟

仅用几行代码,让Python函数执行快30倍

Python 是一种流行的编程语言,也是数据科学社区中最受欢迎的语言。与其他流行编程语言相比,Python 的主要缺点是它的动态特性和多功能属性拖慢了速度表现。Python 代码是在运行时被解释的,而不是在编译时被编译为原生代码。


Python 多线程处理的基本指南


C 语言的执行速度比 Python 代码快 10 到 100 倍。但如果对比开发速度的话,Python 比 C 语言要快。对于数据科学研究来说,开发速度远比运行时性能更重要。由于存在大量 API、框架和包,Python 更受数据科学家和数据分析师的青睐,只是它在性能优化方面落后太多了。


在本文中,我们将讨论如何用多处理模块并行执行自定义 Python 函数,并进一步对比运行时间指标。

多处理入门

考虑一个单核心 CPU,如果它被同时分配多个任务,就必须不断地中断当前执行的任务并切换到下一个任务才能保持所有进程正常运行。对于多核处理器来说,CPU 可以在不同内核中同时执行多个任务,这一概念被称为并行处理。

它为什么如此重要?

数据整理、特征工程和数据探索都是数据科学模型开发管道中的重要元素。在输入机器学习模型之前,原始数据需要做工程处理。对于较小的数据集来说,执行过程只需几秒钟就能完成;但对于较大的数据集而言,这项任务就比较繁重了。


并行处理是提高 Python 程序性能的一种有效方法。Python 有一个多处理模块,让我们能够跨 CPU 的不同内核并行执行程序。

实现

我们将使用来自 multiprocessing 模块的 Pool 类,针对多个输入值并行执行一个函数。这个概念称为数据并行性,它是 Pool 类的主要目标。


我将使用从Kaggle下载的Quora问题对相似性数据集来演示这个模块。


上述数据集包含了很多在 Quora 平台上提出的文本问题。我将在一个 Python 函数上执行多处理模块,这个函数通过删除停用词、删除 HTML 标签、删除标点符号、词干提取等过程来处理文本数据。


preprocess() 就是执行上述文本处理步骤的函数。


可以在这里找到托管在我的 GitHub 上的函数 preprocess()的代码片段。


现在,我们使用 multiprocessing 模块中的 Pool 类为数据集的不同块并行执行该函数。数据集的每个块都将并行处理。


import multiprocessingfrom functools import partialfrom QuoraTextPreprocessing import preprocess
BUCKET_SIZE = 50000
def run_process(df, start): df = df[start:start+BUCKET_SIZE] print(start, "to ",start+BUCKET_SIZE) temp = df["question"].apply(preprocess) chunks = [x for x in range(0,df.shape[0], BUCKET_SIZE)] pool = multiprocessing.Pool()func = partial(run_process, df)temp = pool.map(func,chunks)pool.close()pool.join()
复制代码


该数据集有 537,361 条记录(文本问题)需要处理。对于 50,000 的桶大小,数据集被分成 11 个较小的数据块,这些块可以并行处理以加快程序的执行时间。

基准测试:

人们常问的问题是使用多处理模块后执行速度能快多少。我在实现了数据并行性,对整个数据集执行一次 preprocess()函数后对比了基准执行时间。


运行测试的机器有 64GB 内存和 10 个 CPU 内核。



多处理和单处理执行的基准时间


从上图中,我们可以观察到 Python 函数的并行处理将执行速度提高了近 30 倍


你可以在我的 GitHub 中找到用于记录基准测试数据的 Python文件


基准测试过程

结论


在本文中,我们讨论了 Python 中多处理模块的实现,该模块可用于加速 Python 函数的执行。添加几行多处理代码后,具有 537k 实例的数据集的执行时间几乎快了 30 倍。


处理大型数据集的时候,我建议大家使用并行处理,因为它可以节省大量时间并加快工作流程。


请参阅我关于加速 Python 工作流程的其他文章:


参考文章

[1]多处理文档:https://docs.python.org/3/library/multiprocessing.html


原文链接:


https://towardsdatascience.com/25x-times-faster-python-function-execution-in-a-few-lines-of-code-4c82bdd0f64c

福利推荐

2021 年 ArchSummit 全球架构师峰会深圳站设置【高可用高性能业务架构】专题,将邀请阿里巴巴、同程旅行、Shopee 等一线专家,分享在不同团队、不同业务场景、不同技术栈下,如何实现业务的快速开发并保证其架构具备良好的扩展性和容错能力,如何分析关乎用户体验的系统瓶颈和构建高性能系统。9 月 3-4 日,我们重回深圳。


点击底部【阅读原文】查看所有上线专题。大会席位 9 折限时优惠,联系票务小姐姐小倩预定现场席位:18514549229(同微信)。



<recommend image="https://static.geekbang.org/infoq/5b5c80a75b210.png?imageView2/0/w/800"


title="微软认为 AutoML 不够用,智能系统才是未来!"


link="">


</recommend>



2021 年 8 月 04 日 15:327420
用户头像
刘燕 InfoQ记者

发布了 760 篇内容, 共 248.0 次阅读, 收获喜欢 1454 次。

关注

评论 1 条评论

发布
用户头像
async/await 不香吗?
2021 年 09 月 01 日 18:19
回复
没有更多了
发现更多内容

Spring系列第2篇:控制反转(IoC)与依赖注入(DI),晦涩难懂么?

老大哥

架构师技术领导力成长之路

IT民工大叔

领导力 架构师

六字说出微服务的本质

看山

架构 微服务 签约计划第二季

新技术(区块链)--让游戏行业走的更远

CECBC

区块链技术 防篡改不可逆

(政务上链)新数据孤岛、安全风险等问题待解

CECBC

工作效率 公开透明 新技术

Java异步之《我call(),Future在哪里》

BUZHIDAO

助力银行核心下移,监控分布式数据库,融天鹰眼轻松应对五大挑战

DT极客

继oneAPI之后,英特尔为异构计算跨架构编程再添“利器” 发布全新机器编程系统

最新动态

LeetCode题解:189. 旋转数组,使用新数组Copy,JavaScript,详细注释

Lee Chen

大前端 LeetCode

ARTS打卡Week 09

teoking

LeetCode题解:189. 旋转数组,pop+unshift一行,JavaScript,详细注释

Lee Chen

大前端 LeetCode

智能的财务管理系统,来自某科技公司CEO亲手搭建

明道云

实现扫码登陆的最简单方案与原理

Java小咖秀

Java 解决方案 经验总结

海华大赛第一名团队聊比赛经验和心得:AI在垃圾分类中的应用

华为云开发者社区

AI 算法 数据分析 垃圾回收机制 华为云

创业公司技术体系建设-CI/CD

星际行者

CI/CD

骚操作!用 CPU 烤肉,这位程序员做到了!

程序员生活志

程序员 gpu 程序人生

java高并发系列 - 第11天:线程中断的几种方式

简爱W

腾讯安全领御区块链与张裕集团达成战略合作,打造高端葡萄酒区块链溯源平台

CECBC

产品溯源 无法篡改

实践录丨如何在鲲鹏服务器OpenEuler操作系统中快速部署OpenGauss数据库

华为云开发者社区

数据库 鲲鹏920 操作系统 服务器 opengauss

【华为云技术分享】DLI跨源|当DLI遇见MongoDB

华为云开发者社区

数据库 mongodb dlib 数据集 华为云

Springboot拦截器使用及其底层源码剖析

南方有乔木兮

Android Development最佳实践

teoking

Twitter高性能分布式日志系统架构解析

俊俊哥

pulsar bookKeeper 分布式文件存储

秒懂云通信:如何用阿里云语音通知服务(小白指南)

阿里云Edge Plus

语音

IDEA 插件找不到?看这里!那就自己敲一个!

程序员小航

json IDEA 开发工具 idea插件 IntelliJ IDEA

并发编程基础原理

刚刚🏂

LeetCode002-两数相加-medium

书旅

算法 数据结构与算法

面经手册 · 第1篇《认知自己的技术栈盲区》

小傅哥

Java 面试 小傅哥 技术栈

功能扎实的ERP模版已上架应用库(支持免费安装使用)

明道云

JVM系列之:通过一个例子分析JIT的汇编代码

程序那些事

Java JVM JIT 汇编

信创舆情一线--抖音、微信读书被判侵害用户个人信息权益

统小信uos

仅用几行代码,让Python函数执行快30倍-InfoQ