写点什么

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

  • 2021-08-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-08-04 15:328439
用户头像
刘燕 InfoQ高级技术编辑

发布了 1103 篇内容, 共 433.7 次阅读, 收获喜欢 1912 次。

关注

评论 1 条评论

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

测试人生 | (汇总篇)从小团队的业务到独角兽的测开,涨薪超过60%,90后小哥哥凤凰涅槃了

霍格沃兹测试开发学社

测试人生 | 30 而立之年的蜕变,6 个月完成从国企到 BAT 大厂测开的华丽转身

霍格沃兹测试开发学社

计算机网络——封装成帧和透明传输

StackOverflow

编程 计算机网络 9月月更

测试面试真题|抖音的广告系统前后台,该如何测试?

霍格沃兹测试开发学社

搭建在线帮助中心是企业最重要的第一步

Baklib

企业 在线文档 帮助中心 帮助文档

软件测试 | 测试开发 | 《穿越时空的git》之创建版本库和常用命令操作

测吧(北京)科技有限公司

测试

测试人生 | 从传统行业到名企大厂,薪资翻倍,我做到了

霍格沃兹测试开发学社

测试人生 | 半年涨薪10W+,从手工+外包是如何完成蜕变的?

霍格沃兹测试开发学社

软件测试 | 测试开发 | 一文彻底理解 Cookie、Session、Token

测吧(北京)科技有限公司

测试

个推直播预告:9月26日,一线专家分享APP数字化运营方法与实践

个推

数字化 用户画像 标签体系

软件测试 | 测试开发 | 不懂PO 设计模式?这篇实战文带你搞定 PO

测吧(北京)科技有限公司

测试

阿里MaxCompute生态团队负责人—李睿博 : 参与开源,让自己的履历与众不同|《大神详解开源 BUFF 增益攻略》讲座回顾

Apache IoTDB

数据库 线上讲座 Apache IoTDB 企业号九月金秋榜

当面试官问你:如何才能带领好团队?

霍格沃兹测试开发学社

测试面试 | 某个版本/模块问题很多,但上线时间紧迫怎么办?

霍格沃兹测试开发学社

测试面试 | 某互联网大厂测试面试真题,你能回答出多少?

霍格沃兹测试开发学社

测试面试真题|从手工到测开,一位测试媛宝妈的 BAT 大厂逆袭之旅

霍格沃兹测试开发学社

软件测试 | 测试开发 | Python中日志异步发送到远程服务器

测吧(北京)科技有限公司

测试

提质增效,安全灵活,阿里云EDA上云方案让芯片设计驶入高速路

阿里云弹性计算

HPC EDA 高性能计算 芯片开发

Saas企业数字化必不可少的工具——帮助中心

Baklib

SaaS 企业 数字化 帮助中心

探索http1.0到http3.0的发展史,详解http2.0

ike潮

HTTP HTTP2.0 HTTP3.0 TCP协议 UDP协议

软件测试 | 测试开发 | app自动化测试(iOS)元素定位(新手篇)

测吧(北京)科技有限公司

测试

测试人生 | 毕业2年,拒绝独角兽入职名企大厂涨薪10万+,这个95后小姐姐好飒

霍格沃兹测试开发学社

软件测试 | 测试开发 | JAR 文件规范详解

测吧(北京)科技有限公司

测试

【Vue2】简易Vue2-简易图书借阅管理

Sam9029

Vue 前端 9月月更

企业FAQ页面案例展示及FAQ站点搭建技巧

Baklib

企业 FAQ

性能测试知识科普(二):测试策略

老张

性能测试

软件测试 | 测试开发 | iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | iOS自动化真机测试验证环境过程中常见问题解析

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 一文搞定 Postman 接口自动化测试

测吧(北京)科技有限公司

测试

JS-内置对象API-Array(数组)-(二)-不改变原数组的API-篇

Sam9029

JavaScript 前端 9月月更

大厂校招SSP获得者—张金瑞 :开源项目,求职者的最佳简历|《大神详解开源 BUFF 增益攻略》讲座回顾

Apache IoTDB

开源 求职 Apache IoTDB 企业号九月金秋榜

仅用几行代码,让Python函数执行快30倍_AI_Satyam Kumar_InfoQ精选文章