如何用Python将数据预处理速度提升2至6倍?

2018 年 10 月 19 日 AI前线
 
作者 | George Seif
译者 | 无明
编辑 | Vincent
AI 前线导读:Python 是机器学习的首选编程语言。它易于使用,还提供了很多出色的库让数据处理变得轻而易举!但在处理大量数据时,事情变得棘手起来......

现如今,“大数据”通常指的是包含数十万甚至数百万个数据点的数据集!基于这样的规模,每一个小的计算步骤都会累加起来,我们在编码管道的每一个步骤都要考虑到效率问题。在考虑机器学习系统效率时,经常被忽视的一个关键步骤是数据预处理。在进行预处理时,我们必须对所有数据点进行某种操作。

默认情况下,Python 程序作为单个进程运行在单个 CPU 上。大多数用于机器学习的现代机器至少有 2 个 CPU 核心。这意味着在进行预处理时,默认情况下有 50%或更多的 CPU 资源将无法执行任何操作!在使用 4 核(英特尔 i5)或 6 核(英特尔 i7)CPU 时,情况会变得更糟。

所幸的是,内置的 Python 库中有一些隐藏的功能,可以让我们充分利用所有的 CPU 内核!这要归功于 Python 的 concurrent.futures 模块,只需 3 行代码就可以将普通程序转换为可以跨 CPU 核心并行处理数据的程序。

更多优质内容请关注微信公众号“AI 前线”(ID:ai-front)
标准方式

让我们举一个简单的例子,我们有一个图像数据集,可能有数千甚至数百万张图像!出于时间方面的考虑,我们只使用 1000 张。在将所有图像传到深度神经网络之前,我们想要将它们的大小调整为 600x600。以下是 GitHub 上经常可以看到的一些非常标准的 Python 处理代码。

这个程序遵循的是数据处理脚本中常见的简单模式:

从要处理的文件(或其他数据)列表开始。使用 for 循环逐个处理数据,并在每个循环迭代上进行预处理。

让我们使用一个包含 1000 个 jpeg 文件的文件夹来测试这个程序,看看需要多长时间:

在我的机器(6 个内核的 i7-8700k CPU)上运行时间为 7.9864 秒!对于这样高端的 CPU 来说,这看起来有点慢了。让我们看看可以做些什么来加快速度。

更快的方式

为了理解 Python 如何并行处理事物,我们可以先了解并行处理本身是怎么回事。假设我们要将 1000 颗钉子钉入一块木头,钉一颗钉子需要 1 秒钟,如果是 1 个人做,那么总的需要 1000 秒时间。但如果团队中有 4 个人,我们将钉子分成四份,让每个人负责钉自己的钉子。使用这种方法,我们只需 250 秒即可完成任务!

同样,我们可以使用 Python 来处理上面的 1000 张图像:

  • 将 jpg 文件列表拆分为 4 组。

  • 运行 4 个单独的 Python 解释器实例。

  • 让每个 Python 实例处理 4 组图像中的一个。

  • 合并 4 个实例的处理结果,得到最终结果。

Python 为我们处理了所有“脏活”。我们只需要告诉它想要运行哪个函数,以及使用多少个 Python 实例,然后它会完成所有其他操作!我们只需修改 3 行代码。

在上面的代码中:

启动与 CPU 核心一样多的 Python 进程,这里是 6 个。实际进行处理的是这行代码:

executor.map() 将你想要运行的函数以及要处理的图像列表作为输入。因为我们有 6 个核心,所以可以同时处理列表中的 6 张图像!

如果我们再次运行我们的程序:

运行时间为 1.14265 秒,快了 6 倍!

注意:生成更多的 Python 进程并在它们之间 shuffle 数据会带来一些额外的开销,所以不一定总是会得到这么大的速度提升。但总的来说,速度的提升是非常明显的。

它总会这么快吗?

当你要对数据集中的每个数据点执行相似的计算时,使用 Python 并行进程池是一个很好的办法。但是,它并不总是完美的解决方案。并行进程池不会按照任何可预测的顺序来处理数。如果你需要处理结果按特定顺序排列,那么这个方法可能就不适合你。

Python 需要知道如何“pickle”你要处理的数据类型。所运的是,Python 官方文档提到了这些类型:  

  • None、True、False;

  • 整数、浮点数、复数;

  • 字符串、字节、字节数组;

  • 仅包含可处理的对象的元组、列表、集合和词典;

  • 在模块顶层定义的函数(使用 def 而不是 lambda 进行定义);

  • 在模块顶层定义的内置函数;

  • 在模块顶层定义的类;

  • __dict__ 或 __getstate()__ 调用结果是可处理的类实例。

英文原文:

https://towardsdatascience.com/heres-how-you-can-get-a-2-6x-speed-up-on-your-data-pre-processing-with-python-847887e63be5

如果你喜欢这篇文章,或希望看到更多类似优质报道,记得给我留言和点赞哦!


登录查看更多
1

相关内容

数据预处理(data preprocessing)是指在主要的处理以前对数据进行的一些处理。如对大部分地球物理面积性观测数据在进行转换或增强处理之前,首先将不规则分布的测网经过插值转换为规则网的处理,以利于计算机的运算。另外,对于一些剖面测量数据,如地震资料预处理有垂直叠加、重排、加道头、编辑、重新取样、多路编辑等。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
255+阅读 · 2020年6月10日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
227+阅读 · 2020年5月21日
Python分布式计算,171页pdf,Distributed Computing with Python
专知会员服务
105+阅读 · 2020年5月3日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
171+阅读 · 2020年1月1日
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
18+阅读 · 2019年10月28日
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
从基础概念到实现,小白如何快速入门PyTorch
机器之心
13+阅读 · 2018年2月26日
10个深度学习软件的安装指南(附代码)
数据派THU
17+阅读 · 2017年11月18日
Python NLP 入门教程
大数据技术
19+阅读 · 2017年10月24日
利用python操作Excel教程
Python技术博文
4+阅读 · 2017年9月13日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
Arxiv
108+阅读 · 2020年2月5日
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Meta-Transfer Learning for Few-Shot Learning
Arxiv
7+阅读 · 2018年12月6日
A Survey on Deep Transfer Learning
Arxiv
11+阅读 · 2018年8月6日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
3+阅读 · 2018年3月2日
VIP会员
相关VIP内容
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
255+阅读 · 2020年6月10日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
227+阅读 · 2020年5月21日
Python分布式计算,171页pdf,Distributed Computing with Python
专知会员服务
105+阅读 · 2020年5月3日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
171+阅读 · 2020年1月1日
相关资讯
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
18+阅读 · 2019年10月28日
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
从基础概念到实现,小白如何快速入门PyTorch
机器之心
13+阅读 · 2018年2月26日
10个深度学习软件的安装指南(附代码)
数据派THU
17+阅读 · 2017年11月18日
Python NLP 入门教程
大数据技术
19+阅读 · 2017年10月24日
利用python操作Excel教程
Python技术博文
4+阅读 · 2017年9月13日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
相关论文
Arxiv
108+阅读 · 2020年2月5日
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Meta-Transfer Learning for Few-Shot Learning
Arxiv
7+阅读 · 2018年12月6日
A Survey on Deep Transfer Learning
Arxiv
11+阅读 · 2018年8月6日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
3+阅读 · 2018年3月2日
Top
微信扫码咨询专知VIP会员