专栏首页Python数据科学经验 | 3行代码数据预处理提速6倍!

经验 | 3行代码数据预处理提速6倍!

Python是所有机器学习的首选编程语言。它易于使用,并拥有许多很棒的库,可以轻松地处理数据。但是当我们需要处理大量数据时,事情就变得棘手了......

“大数据”这个词通常指的是数据集,一个数据集里的数据点如果没有数百万个,也有数十万。在这样的规模上,每个小的计算加起来,而且我们需要在编码过程的每个步骤保持效率。在考虑机器学习系统的效率时,经常被忽视的一个关键步骤就是预处理阶段,我们必须对所有数据点进行某种预处理操作。

默认情况下,Python程序使用单个CPU作为单个进程执行。大多数用于机器学习的计算机至少有2个CPU核心。这意味着,对于2个CPU内核的示例,在运行预处理时,50%或更多的计算机处理能力在默认情况下不会做任何事情!当你使用4核( Intel i5)或6核( Intel i7)时,就更浪费了。

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

标准方法

让我们举一个简单的例子,我们在一个文件夹中有一个图像数据集; 或者我们甚至有成千上万的图像!为了节省处理时间,我们在这里使用1000张图像。我们希望在将所有图像在传输到深度神经网络之前将其大小调整为600x600。下面就是你经常在GitHub上看到的一些非常标准的Python代码。

这个程序遵循在数据处理脚本中经常看到的简单模式:

  • 首先是要处理的文件(或其他数据)列表;
  • 你可以使用for循环逐个处理每个数据片段,然后在每个循环迭代上运行预处理

让我们在一个包含1000个jpeg文件的文件夹上测试这个程序,看看运行需要多长时间:

在我的具有6个CPU核心的i7-8700k上,这个程序的运行时间是7.9864秒!对于这样的高端CPU来说,似乎有点慢。让我们看看我们可以做些什么来加快速度。

快速方式

为了理解我们希望Python如何并行处理事物,直观地思考并行处理本身是有帮助的。假设我们必须执行相同的任务,例如将钉子钉入一块木头,我们的桶中有1000个钉子。如果钉每个钉子需要1秒钟,那么1个人的话需要花1000秒完成工作。但是如果有4个人,我们会将整桶钉子平均分成4堆,然后每个人处理自己的一堆钉子。这样,只需250秒即可完成任务!

在这个包含1000张图像的任务中,也可以这样处理:

  1. 将jpg文件列表分为4个较小的组。
  2. 运行Python解释器的4个独立实例。
  3. 让每个Python实例处理4个较小数据组中的一个。
  4. 结合4个过程的结果,得到最终的结果列表。

这里最重要的部分是Python为我们处理了所有艰苦的工作。我们只是告诉它我们想要运行哪个函数,以及使用多少Python实例,然后它完成了所有其他操作!我们只需修改3行代码。

上面的代码中的:

你有多少CPU核心就启动多少Python进程,在我的例子中是6个。实际的处理代码是这样的:

executor.map()将你想要运行的函数和一个列表作为输入,列表中的每个元素都是函数的单个输入。由于我们有6个核心,我们将同时处理列表中的6个项!

再次运行程序看看:

运行时间是1.14265秒,几乎加速了6倍!

注意:产生更多Python进程并在它们之间移动数据时,会产生一些开销,因此不会总是得到这么大的速度提升。 但总的来说,加速相当显著。

是否总能大幅加速

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

你处理的数据还必须是Python知道如何“pickle”的类型。幸运的是,这些类型很常见。以下来自Python官方文档:

  • None, True, 及 False
  • 整数,浮点数,复数
  • 字符串,字节,字节数组
  • 仅包含可选对象的元组,列表,集合和词典
  • 在模块的顶层定义的函数(使用def,而不是lambda)
  • 在模块顶层定义的内置函数
  • 在模块顶层定义的类
  • 这些类的实例,__dict__或调用__getstate __()的结果是可选择的

本文分享自微信公众号 - Python数据科学(Python_Spiderman)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于D3.js实现分类多标签的Tree型结构可视化

    今天新来的实习生需要对部分分类文本进行多标签的检测,即根据已构建好的一、二级标签Excel文档,对众包平台人工标注的数据以及机器标注的数据进行评测。

    用户1332428
  • 三天搞定Python基础功,Day 1基础篇

    因为我恰巧要给本科生上一个introduction的课程,因此把我自己做的课件也跟大家分享一下。为无任何基础的人设计,带你串一遍Python的基本操作。

    小小科
  • 【每周一坑】暴力计算圆周率 +【解答】生成/识别二维码

    我们之前有出过一些和概率相关的问题。我讲过,用计算机程序来解编程题有个很有意思的思路,就是暴力解法。就是利用电脑的计算能力,去模拟大量的情况(甚至所有情况),得...

    Crossin先生
  • 初步尝试 sklearn

    Scikit-learn是一个用于Python编程语言的免费软件机器学习库。 它具有各种分类,回归和聚类算法,包括支持向量机,随机森林,梯度增强,k均值和DBS...

    小歪
  • 新版本PyCharm Debug mode off解决方案

    就是即使代码中增加了app.debug=True执行时这里仍然是off,网上答案说在Edit Configurations中勾选FLASK_DEBUG:

    用户2149234
  • 这4个Python实战项目,让你瞬间读懂Python!

    Python当下真的很火。Python实战项目,也一直尤为关注,接下来,和大家介绍下十个Python练手的实战项目

    一墨编程学习
  • Python爬取电影天堂

    摘取部分网友的回复: 1、之前在北京买房,谁想房价开始疯长,链家的房价等数据分析只给了一小部分,远远不能满足自己的需求。于是晚上花了几个小时的时间写了个爬虫,...

    Dwyane
  • 10行代码让你秒变撩妹达人:用Python做一个聊天机器人

    简易版代码,是对任何人、任何群、任何公众号的新的内容都会回复,这bug问题很大。因为有的时候,一不小心顶撞了长辈、领导,那可就坑爹了。所以我们需要限定聊天对象的...

    华章科技
  • 200行代码,一行行教你自制微信机器人

    1) 用一个windows客户端工具运营公众号,真的很局限。虽然工具的功能很强大,能自动添加好友,自动拉好友入群,关键字回复等等,但是有一个绕不开的点,它是一款...

    用户1634449
  • Django小技巧01: redirect

    redirect函数会返回一个HttpResponseRedirect类,比起HttpResponseRedirect类我更喜欢使用更简洁的redirect. ...

    用户1416054

扫码关注云+社区

领取腾讯云代金券