选自TowardsDataScience

作者:George Seif

本文转自机器之心(nearhuman2014

本文可以教你仅使用 3 行代码,大大加快数据预处理的速度。

Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时,一些问题就会显现……

在默认情况下,Python 程序是单个进程,使用单 CPU 核心执行。而大多数当代机器学习硬件都至少搭载了双核处理器。这意味着如果没有进行优化,在数据预处理的时候会出现「一核有难九核围观」的情况——超过 50% 的算力都会被浪费。在当前四核处理器(英特尔酷睿 i5)和 6 核处理器(英特尔酷睿 i7)大行其道的时候,这种情况会变得更加明显。

幸运的是,Python 库中内建了一些隐藏的特性,可以让我们充分利用所有 CPU 核心的能力。通过使用 Python 的 concurrent.futures 模块,我们只需要 3 行代码就可以让一个普通的程序转换成适用于多核处理器并行处理的程序。

标准方法

让我们举一个简单的例子,在单个文件夹中有一个图片数据集,其中有数万张图片。在这里,我们决定使用 1000 张。我们希望在所有图片被传递到深度神经网络之前将其调整为 600×600 像素分辨率的形式。以下是你经常会在 GitHub 上看到的标准 Python 代码:

import glob
import os
import cv2### Loop through all jpg files in the current folder
### Resize each one to size 600x600
for image_filename in glob.glob("*.jpg"):### Read in the image dataimg = cv2.imread(image_filename)### Resize the imageimg = cv2.resize(img, (600, 600)) 

上面的程序遵循你在处理数据脚本时经常看到的简单模式:

1. 首先从需要处理内容的文件(或其他数据)列表开始。

2. 使用 for 循环逐个处理每个数据,然后在每个循环迭代上运行预处理。

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

time python standard_res_conversion.py

在我的酷睿 i7-8700k 6 核 CPU 上,运行时间为 7.9864 秒!在这样的高端 CPU 上,这种速度看起来是难以让人接受的,看看我们能做点什么。

更快的方法

为了便于理解并行化的提升,假设我们需要执行相同的任务,比如将 1000 个钉子钉入木头,假如钉入一个需要一秒,一个人就需要 1000 秒来完成任务。四个人组队就只需要 250 秒。

在我们这个包含 1000 个图像的例子中,可以让 Python 做类似的工作:

  • 将 jpeg 文件列表分成 4 个小组;

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

  • 让 Python 的每个实例处理 4 个数据小组中的一个;

  • 结合四个处理过程得到的结果得出最终结果列表。

这一方法的重点在于,Python 帮我们处理了所有棘手的工作。我们只需告诉它我们想要运行哪个函数,要用多少 Python 实例,剩下的就交给它了!只需改变三行代码。实例:

import glob
import os
import cv2
import concurrent.futuresdef load_and_resize(image_filename):### Read in the image dataimg = cv2.imread(image_filename)### Resize the imageimg = cv2.resize(img, (600, 600)) ### Create a pool of processes. By default, one is created for each CPU in your machine.
with concurrent.futures.ProcessPoolExecutor() as executor:### Get a list of files to processimage_files = glob.glob("*.jpg")### Process the list of files, but split the work across the process pool to use all CPUs### Loop through all jpg files in the current folder ### Resize each one to size 600x600executor.map(load_and_resize, image_files)

从以上代码中摘出一行:

with concurrent.futures.ProcessPoolExecutor() as executor:

你的 CPU 核越多,启动的 Python 进程越多,我的 CPU 有 6 个核。实际处理代码如下:

executor.map(load_and_resize, image_files)

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

如果再次用以下代码运行我们的程序:

time python fast_res_conversion.py

我们可以将运行时间降到 1.14265 秒,速度提升了近 6 倍!

注意:在生成更多 Python 进程及在它们之间整理数据时会有一些开销,所以速度提升并不总是这么明显。但是总的来说,速度提升还是非常可观的。

它总是那么快吗? 

如果你有一个数据列表要处理,而且在每个数据点上执行相似的运算,那么使用 Python 并行池是一个很好的选择。但有时这不是最佳解决方案。并行池处理的数据不会在任何可预测的顺序中进行处理。如果你对处理后的结果有特殊顺序要求,那么这个方法可能不适合你。

你处理的数据也必须是 Python 可以「炮制」的类型。所幸这些指定类别都很常见。以下来自 Python 官方文件:

  • None, True, 及 False

  • 整数、浮点数、复数

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

  • 只包含可挑选对象的元组、列表、集合和字典

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

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

  • 在模块顶层定义的类

  • 这种类的实例,其 __dict__ 或调用__getstate__() 的结果是可选择的(参见「Pickling Class Instances」一节)。

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

- End -

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方“小詹学Python”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。

就是这么流弊!三行Python代码,让数据处理速度提高2到6倍相关推荐

  1. python image 转成字节_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍

    选自TowardsDataScience 作者:George Seif 本文转自机器之心(nearhuman2014) 本文可以教你仅使用 3 行代码,大大加快数据预处理的速度. Python 是机器 ...

  2. python读取mysql数据每次都耗时600秒_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍...

    幸运的是,Python 库中内建了一些隐藏的特性,可以让我们充分利用所有 CPU 核心的能力.通过使用 Python 的 concurrent.futures 模块,我们只需要 3 行代码就可以让一个 ...

  3. python image 转成字节_就是这么牛!三行Python代码,让数据处理速度提高2到6倍

    本文可以教你仅使用 3 行代码,大大加快数据预处理的速度. Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据.但当我们面临大量数据时,一些问题就会显现-- ...

  4. python游戏中调整箭头下落速度_入门 | 三行Python代码,让数据预处理速度提高2到6倍...

    原标题:入门 | 三行Python代码,让数据预处理速度提高2到6倍 选自TowardsDataScience 作者:George Seif,机器之心编译 在 Python 中,我们可以找到原生的并行 ...

  5. 三行Python代码,实现数据库和excel之间的导入导出!

    大家好,我是辰哥 之前有小伙伴私信我使用python如何将excel文件与mysql之间进行快速转换?今天我把这个方案写出来供大家参考. 数据库->Excel 使用Python代码实现数据从数据 ...

  6. python代码学习-数据处理图片加遮挡、噪声、模糊

    python代码学习-数据处理图片加遮挡.噪声.模糊 (一)python代码学习-数据处理图片加遮挡 代码: from matplotlib import pyplot as plt from PIL ...

  7. 三行python代码实现人工智能

    三行python代码实现人工智能 中野独立团团长李云龙 2018-12-25 09:28:05 话不多说直接上代码 while True: a=input() print(a) 有人说人工智能的本质就 ...

  8. 3000 字推荐一个可视化神器,50 行 Python 代码制作数据大屏

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编给大家分享一个制作数据大屏的工具,非常的好用,100行左右的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解. Py ...

  9. dataframe 输出标题_【学界】第八章:Python代码之数据输出、调参与算法总结

    作者:小杨 学校:广东工业大学 年级:研二 专业:工业工程 主要研究兴趣:强化学习.深度学习 简介:作者是广东工业大学2016级工业工程系研究生,师从广东工业大学教授.博士生导师.<工业工程&g ...

最新文章

  1. css图片悬停边框,CSS悬停边框使内联元素稍微调整
  2. mysql-5.2 lib_Centos 5.2下安装多个mysql数据库配置详解
  3. java model 中文乱码_Java解压zip 解决编码和中文乱码问题
  4. 又遇到问题:wrong ELF class: ELFCLASS32 in Unknown on line
  5. 【数字信号处理】相关函数 ( 相关函数性质 | 相关函数共轭对称性质 | 实信号自相关函数偶对称 | 复信号自相关函数共轭对称 | 复信号互相关函数共轭对称 )
  6. currenttimemillis 毫秒还是秒_亿级数据毫秒级查询!ElasticSearch是怎么做到的?
  7. windows PE 文件格式图(AI实现)
  8. 12-6路径的其他操作
  9. python logging模块使用详解
  10. java将Word转换成PDF三种方法
  11. Android在自定义View(SurfaceView)中实现进度条Progress
  12. 产品经理告诉你什么是PMF?什么是MVP?
  13. 判断两个圆相切或相交
  14. 指标梳理对成功实施BI项目有什么意义
  15. VUE--Form表单
  16. LARS回归算法的几何意义
  17. 算法与价值观如何平衡?凤凰新闻客户端新版给出了答案
  18. 怎样把几个PDF文档合并一个文件?
  19. 教你win10电脑声音太小怎么办
  20. springboot文件上传之MultipartFile(图片)转base64

热门文章

  1. 如何用Python从数据库里面获取数据?4个步骤就能轻松实现
  2. 编译安装openresty+mysql+php7
  3. MySQL删库数据延迟恢复策略
  4. TP的门面Facade:静态方式调用方法
  5. Linux之awk:按照字符或列进行筛选与计算列值 条件动作
  6. Linux的软硬链接ln
  7. jQuery Vue的CDN
  8. document write的用法
  9. android 修改菜单大小,如何在NavigationView中更改菜单项图标的大小?
  10. mysql防止误删除_mysql误删除处理方法