社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

3行代码,Python数据预处理提速6倍!(附链接)

数据派THU • 5 年前 • 494 次点击  

来源:新智元

本文2600字,建议阅读8分钟

本文介绍了仅需3行代码,将Python数据处理速度提升2~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张图像的任务中,也可以这样处理:


  • 将jpg文件列表分为4个较小的组。

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

  • 让每个Python实例处理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 __()的结果是可选择的


原文链接:

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



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/ggap2W3cFb
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24720
 
494 次点击