python 多线程处理图像,充分利用CPU
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()函数作为捷径,一步获取原始文件名和每一步中的匹配结果。
适用的问题
- 从一系列单独的网页服务器日志里抓取统计数据。
- 从一堆XML,CSV和JSON文件中解析数据。
- 对大量图片数据做预处理,建立机器学习数据集。
不适用的问题
使用Process Pool需要在独立的Python处理进程之间来回传递数据。如果你要处理的数据不能在处理过程中被有效地传递,这种方法就行不通了。简而言之,你处理的数据必须是Python知道怎么应对的类型。
- 如果样本之间不是独立的,需要联合处理
- 少量样本
参考资料
Quick Tip: Speed up your Python data processing scripts with Process Pools
concurrent.futures — Launching parallel tasks
python 多线程处理图像,充分利用CPU相关推荐
- python 充分利用CPU
当利用python处理大规模数据或者运行一些耗时较长的程序时,往往会发现程序运行时CPU并没有跑满,哪怕开了多线程后CPU利用率仍然不高.这是因为在默认情况下,Python 程序是单个进程,使用单 C ...
- 【Opencv-Tools(一)】OpenCV中使用多线程处理图像
OpenCV中使用多线程处理图像 引用:https://gist.github.com/yinguobing/7d1318e31f6e3455f30527a39361512a #!/usr/bin/e ...
- python 多线程处理_Python中的多处理与多线程:您需要了解的内容。
python 多线程处理 by Timber.io 由Timber.io Python中的多处理与多线程:您需要了解的内容. (Multiprocessing vs Multithreading in ...
- Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式
Python 对图像进行base64编码及解码读取为numpy.opencv.matplot需要的格式 1. 效果图 2. 源码 参考 这篇博客将介绍Python如何对图像进行base64编解码及读取 ...
- 使用OpenCV和Python计算图像的“彩色度”
使用OpenCV和Python计算图像"彩色度" 1. 效果图 2. 炫彩度量方法是什么? 3. 源代码 参考 你是否尝试过计算每个图像的炫彩值,并根据炫彩值对自己的图像数据集进行 ...
- 【python】图像映射:单应性变换与图像扭曲
[python]图像映射:单应性变换与图像扭曲 单应性变换(Homography) 图像扭曲(仿射变换) 图中图 分段仿射扭曲 单应性变换(Homography) 单应性变换(Homography)即 ...
- Python计算机视觉——图像到图像的映射
Python计算机视觉--图像到图像的映射 文章目录 Python计算机视觉--图像到图像的映射 写在前面 1 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 2 图像扭曲 2.1 图像中的图 ...
- 使用 Python 的图像隐写术
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天,世界正在见证前所未有的数据爆炸,我们每天产生的数据量确实令人 ...
- Python垂直翻转图像(Vertically Flip Image)
Python垂直翻转图像(Vertically Flip Image) 目录 Python垂直翻转图像(Vertically Flip Image) #原始图像 #垂直图像翻转
最新文章
- 在日志文件中输出当前时间
- rocketmq之控制台rocketmq-console编译安装(二)
- linux异地文件同步软件,rsync完成异地文件的同步
- 抽象类(纯虚函数、虚函数)和虚基类(虚继承)
- mvn 使用中的错误
- linux 静态库、共享库
- docker php7 mysql分开,Docker nginx+php74+mysql57, 并安装gd和mysql扩展
- 软件系统换服务器地址,软件系统换服务器地址
- tif软件Android版下载,TIF文件查看器
- UCOS-III系统概述
- 植物大战僵尸tv版显示无法连接服务器,创维云电视植物大战僵尸tv版总是无法连接服务器...
- 浙江海洋大学计算机 周斌,浙江海洋大学2018年硕士研究生调剂拟录取名单公示(一)...
- uc保存html,UC浏览器如何保存网页?UC浏览器保存网页教程图文详解
- JAVA POI WORD XWPFDocument 常用操作-随时更新
- 全量备份,差量备份,增量备份的异同
- 东方证券首席架构师樊建:企业微服务架构转型实践
- 夫妻, 是先离开的人幸福,还是后离开的人幸福?
- Uncaughr SyntaxError:Ivalid or unexpected toke(JS)
- GoEXP规则变更通知 l 信创额外奖励活动
- 如何清理各种浏览器缓存文件