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) #原始图像 #垂直图像翻转
最新文章
- pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法
- IOS开发-关于代码管理工具之SVN
- java零基础学习java规划
- iOS8 【xcode6中添加pch全局引用文件】
- WPF在不同.Net版本间的兼容性问题
- WPF:动态显示或隐藏Listview的某一列
- Lesson5 一阶自治微分方程
- Cartographer 安装 2021.10.27
- springboot集成微信公众号文章推送
- python的help()用法
- 小学计算机课题研究方案,小学语文课题研究方案
- PR常见问题「六」pr去水印的几种方法
- 基于Multisim的红路灯电路设计
- 服务器五大相关基础知识【转】
- 谷粒商城-基础篇-环境搭建(P1-P44)
- 全球及中国落地音箱行业市场发展前景展望与投资战略规划研究报告2022-2028年
- 用递归方法将十进制转化为二进制数
- 详解公链,侧链,联盟链,私有链
- Maven账户设置非明文密码
- 网亚机房管理软件系统 v6.0.9.1 免费
热门文章
- CNN简单实战:PyTorch搭建CNN对猫狗图片进行分类
- CSS3,旋转rotate,动画animation
- excel工具栏隐藏了怎么办_excel隐藏的5个超级技巧,只有少数老师知道,你知道是哪几个吗?...
- 服务器网站集成环境哪个好,如何搭建Web服务器之集成环境
- 关系模型中的三类完整性约束:实体完整性、参照完整性和用户定义完整性
- RC4加密以及python实现
- 【2017.05】技术员GHOST系统最新发布(32位/64位)
- mysql 逻辑与_MySQL教程54-MySQL逻辑运算符
- 区块链并非概念,资本同样不是一切
- html5 video mp4白屏,进入H5应用后白屏