Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺寸,用Python没问题!你几乎总是能找到一款可以轻松完成数据处理工作的Python库。

然而,虽然Python易于学习,使用方便,但它并非运行速度最快的语言。默认情况下,Python程序使用一个CPU以单个进程运行。不过如果你是在最近几年配置的电脑,通常都是四核处理器,也就是有8个CPU。这就意味着在你苦苦等待Python脚本完成数据处理工作时,你的电脑其实有90%甚至更多的计算资源就在那闲着没事干!

得益于Python的 concurrent.futures 模块,我们只需3行代码,就能将一个普通数据处理脚本变为能并行处理数据的脚本,提速8倍。

普通Python处理数据方法

比方说,我们有一个全是图像数据的文件夹,想用Python为每张图像做一些处理。

def process_image(filename):# do sth herereturn processedimg# 循环文件夹中所有JPEG图像,为每张图像创建缩略图
for image_file in glob.glob("*.jpg"):processedimg= process_image(image_file)

这段脚本沿用了一个简单的模式,你会在数据处理脚本中经常见到这种方法:首先获得你想处理的文件(或其它数据)的列表,写一个辅助函数,能够处理上述文件的单个数据, 使用for循环调用辅助函数,处理每一个单个数据,一次一个。

但是这只是利用了CPU的一个线程,使用率很低。

试试创建多进程

下面是一种可以让我们并行处理数据的方法:

1.将所有JPEG文件划分为8小块。

2.运行Python解释器的8个单独实例。

3.让每个Python实例处理这8块数据中的一块。

4.将这8部分的处理结果合并,获得结果的最终列表。

4个Python拷贝程序在8个单独的CPU上运行,处理的工作量应该能比一个CPU大约高出8倍,对吧?

Python已经替我们做完了最麻烦的那部分工作。我们只需告诉它想运行哪个函数以及使用多少实例就行了,剩下的工作它会完成。整个过程我们只需要改动3行代码。

import glob
import os
from PIL import Image
import concurrent.futuresdef process_image(filename):# do sth herereturn processedimg# 告诉Python启动4个额外的Python实例,创建Process Pool,默认为电脑的每个CPU创建一个
with concurrent.futures.ProcessPoolExecutor() as executor: ## 获取需要处理的文件列表filenames= glob.glob("*.jpg")# 处理文件列表,但通过Process Pool划分工作,使用全部CPU!for processedimg zip(filenames, executor.map(process_image, filenames)):print('processed success')

该executor.map()函数调用时需要输入辅助函数和待处理的数据列表。这个函数能帮我完成所有麻烦的工作,包括将列表分为多个子列表、将子列表发送到每个子进程、运行子进程以及合并结果等。干得漂亮!这也能为我们返回每个函数调用的结果。Executor.map()函数会按照和输入数据相同的顺序返回结果。所以用Python的zip()函数作为捷径,一步获取原始文件名和每一步中的匹配结果。

适用的问题

  1. 从一系列单独的网页服务器日志里抓取统计数据。
  2. 从一堆XML,CSV和JSON文件中解析数据。
  3. 对大量图片数据做预处理,建立机器学习数据集。

不适用的问题

使用Process Pool需要在独立的Python处理进程之间来回传递数据。如果你要处理的数据不能在处理过程中被有效地传递,这种方法就行不通了。简而言之,你处理的数据必须是Python知道怎么应对的类型。

  1. 如果样本之间不是独立的,需要联合处理
  2. 少量样本

参考资料

Quick Tip: Speed up your Python data processing scripts with Process Pools

concurrent.futures — Launching parallel tasks

python 多线程处理图像,充分利用CPU相关推荐

  1. python 充分利用CPU

    当利用python处理大规模数据或者运行一些耗时较长的程序时,往往会发现程序运行时CPU并没有跑满,哪怕开了多线程后CPU利用率仍然不高.这是因为在默认情况下,Python 程序是单个进程,使用单 C ...

  2. 【Opencv-Tools(一)】OpenCV中使用多线程处理图像

    OpenCV中使用多线程处理图像 引用:https://gist.github.com/yinguobing/7d1318e31f6e3455f30527a39361512a #!/usr/bin/e ...

  3. python 多线程处理_Python中的多处理与多线程:您需要了解的内容。

    python 多线程处理 by Timber.io 由Timber.io Python中的多处理与多线程:您需要了解的内容. (Multiprocessing vs Multithreading in ...

  4. Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式

    Python 对图像进行base64编码及解码读取为numpy.opencv.matplot需要的格式 1. 效果图 2. 源码 参考 这篇博客将介绍Python如何对图像进行base64编解码及读取 ...

  5. 使用OpenCV和Python计算图像的“彩色度”

    使用OpenCV和Python计算图像"彩色度" 1. 效果图 2. 炫彩度量方法是什么? 3. 源代码 参考 你是否尝试过计算每个图像的炫彩值,并根据炫彩值对自己的图像数据集进行 ...

  6. 【python】图像映射:单应性变换与图像扭曲

    [python]图像映射:单应性变换与图像扭曲 单应性变换(Homography) 图像扭曲(仿射变换) 图中图 分段仿射扭曲 单应性变换(Homography) 单应性变换(Homography)即 ...

  7. Python计算机视觉——图像到图像的映射

    Python计算机视觉--图像到图像的映射 文章目录 Python计算机视觉--图像到图像的映射 写在前面 1 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 2 图像扭曲 2.1 图像中的图 ...

  8. 使用 Python 的图像隐写术

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天,世界正在见证前所未有的数据爆炸,我们每天产生的数据量确实令人 ...

  9. Python垂直翻转图像(Vertically Flip Image)

    Python垂直翻转图像(Vertically Flip Image) 目录 Python垂直翻转图像(Vertically Flip Image) #原始图像 #垂直图像翻转

最新文章

  1. 在日志文件中输出当前时间
  2. rocketmq之控制台rocketmq-console编译安装(二)
  3. linux异地文件同步软件,rsync完成异地文件的同步
  4. 抽象类(纯虚函数、虚函数)和虚基类(虚继承)
  5. mvn 使用中的错误
  6. linux 静态库、共享库
  7. docker php7 mysql分开,Docker nginx+php74+mysql57, 并安装gd和mysql扩展
  8. 软件系统换服务器地址,软件系统换服务器地址
  9. tif软件Android版下载,TIF文件查看器
  10. UCOS-III系统概述
  11. 植物大战僵尸tv版显示无法连接服务器,创维云电视植物大战僵尸tv版总是无法连接服务器...
  12. 浙江海洋大学计算机 周斌,浙江海洋大学2018年硕士研究生调剂拟录取名单公示(一)...
  13. uc保存html,UC浏览器如何保存网页?UC浏览器保存网页教程图文详解
  14. JAVA POI WORD XWPFDocument 常用操作-随时更新
  15. 全量备份,差量备份,增量备份的异同
  16. 东方证券首席架构师樊建:企业微服务架构转型实践
  17. 夫妻, 是先离开的人幸福,还是后离开的人幸福?
  18. Uncaughr SyntaxError:Ivalid or unexpected toke(JS)
  19. GoEXP规则变更通知 l 信创额外奖励活动
  20. 如何清理各种浏览器缓存文件

热门文章

  1. Android Studio实现一个垃圾分类系统(Kotlin版本)
  2. 神经网络动物园-逻辑回归-激活函数-梯度下降-反向传播-链式法则
  3. js 数据按时间排序
  4. ios系统下微信小程序支付宝小程序fixed定位失效
  5. 拆装计算机主机,怎样快速拆卸电脑主机
  6. trello使用技巧:如何在 trello 删除 board
  7. 《网络¥安全联盟站》——星球周报
  8. 增强采购流程的 6 个思路
  9. Eclipse详细设置护眼背景色和字体颜色
  10. 0035-购书款的计算