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

3e6834d31fdc7d1a0a26053d596e52a7.png

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

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

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

21bb678c2d9bcdcd561154904cedf1cd.png

幸运的是,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」一节)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sessionStorage 、localStorage 和 cookie 之间的区别(转)

essionStorage 、localStorage 和 cookie 之间的区别(转) 2012-05-08 14:29:19| 分类: HTML5CSS3WEBAPP|举报|字号 订阅 sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据。有了本地数据,…

删除文件夹里的图片,打印删除日志

1 #region 僵尸文件夹中的文件如果不在活文件列表中&#xff0c;删之2 List<string> deadfile new List<string>();3 foreach(string str in lstZombileDic)4 {5 if(Direct…

第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换

目录二变量函数的傅里叶变换二维冲激及其取样性质二维连续傅里叶变换对二维取样和二维取样定理图像中的混叠二维离散傅里叶变换及其反变换二变量函数的傅里叶变换 二维冲激及其取样性质 两个连续变量的冲激函数定义为&#xff1a; δ(t,z){1,tz00,others(4.52)\delta(t, z) …

巧用VC工程下的rc文件

巧用VC工程下的rc文件(发表时间: 2008-12-30 17:20:00) 【评论】 【打印】 【字体&#xff1a;大 中 小】 本文链接&#xff1a;http://blog.pfan.cn/miaowei/40117.html 复制链接 分享到&#xff1a; 0标签:VC rc文件 资源文件 窗口尺寸设置 添加资源 纵观真个的VC工程&a…

蓝桥杯 参考题目 黄金队列(水题)

黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处&#xff0c;墙上的画像一般也挂在房间高度的0.618处&#xff0c;甚至股票的波动据说也能找到0.618的影子.... 黄金分割数是个无理数&#xff0c;也就是无法表示为两个整数的比值。0.618只…

QC4+充电协议_一文看懂各家充电协议!总算彻底理清了

五一小长假马上就要到了&#xff0c;虽说今年的五一小长假是一个长达5天的“Plus”版小长假&#xff0c;但是受到疫情的影响&#xff0c;大多数人还是选择了在家中度过这个假期。既然说到了宅在家里度过这个假期&#xff0c;那么很多人都会选择让手机来陪伴自己度过。虽然最近几…

vi编辑器选项

Vi编辑器有一些选项设置可以帮助人们更好的使用。 在vi中选项分为两种: 1、 开关选项&#xff0c;如果要打开这类选项就使用ex命令——&#xff1a;set 选项&#xff1b;如果要关闭这类选项就是用ex命令——&#xff1a;set no选项&#xff08;注意no和选项之间没有空格&…

javascript作用域容易记错的两个地方

1.function fun() { var a"rxm"; b"cwr"; } alert(a);//错误&#xff0c;a局部变量 alert(b); //"cwr",b全局变量。 2. var a"rxm"; function fun() { alert(a);var a"123"; alert(a); }fun();alert(a); 输出结果&#xff1…

第4章 Python 数字图像处理(DIP) - 频率域滤波6 - 二维DFT和IDFT的一些性质 - 平移和旋转、周期性、对称性

目录二维DFT和IDFT的一些性质空间间隔和频率间隔的关系平移和旋转周期性对称性二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 Δu1MΔT(4.69)\Delta u \frac{1}{M \Delta T} \tag{4.69}ΔuMΔT1​(4.69) Δv1NΔZ(4.70)\Delta v \frac{1}{N \Delta Z} \tag{4.70}ΔvNΔ…

类图 示例

神州六号飞船是神州飞船系统的一种&#xff0c;它由轨道舱、返回舱、推进舱和逃逸求生塔等组成&#xff1b;航天员可以在返回舱内驾驶飞船&#xff0c;轨道舱由是航天员工作和休息的场所。在紧急的情况下&#xff0c;可以利用逃逸求生塔逃生。在飞船两侧有多个太阳能电池翼&…

bat 命令返回结果_bat教程[284] unzip解压

古树屋Click to follow us(1)unzip命令的简介C:\Users\86137\Desktop>unzip -hUnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spieler. Sendbug reports using http://www.info-zip.org/zip-bug.html; see README for details.Usage: unzip [-Z] [-opts[mo…

K/3 MRP运算数据不准的原因及解决方案

系统MRP计算的结果不正确, 经过分析系统的数据&#xff0c;把MRP计算不正确原因整理如下:1.系统中存在大量的生产任务单没有完全领料&#xff0c;但被结案&#xff0c;造成部份领料单窜单领料&#xff0c;最终引起已分配量不正确2.系统中存在大量的手工录入的生产领料单3.存在部…

解压版本的tomcat服务安装

以下适合各个版本的tomcat&#xff08;注意启动时8080端口要确保未被占用&#xff09; 今天搭一个Tomcat服务器,为了方便决定将解压版&#xff08;非windows的安装方式&#xff09;的tomcat添加为一个windows服务。 环境&#xff1a; JDK 1.5.0_06 Tomcat-5.5.20 Windows2003 瑞…

Framework7:不会Objective-C,也能开发iOS7应用

摘要&#xff1a;Framework7是一款开源的轻量级HTML框架&#xff0c;用来创建混合或有着iOS7原生体验的Web应用。其包含HTML布局、所有基础界面、动画效果、视图以及简单的自定义样式&#xff0c;让你无需修炼Objective-C语言&#xff0c;就可以构建自己的iOS7应用。 Framework…

第4章 Python 数字图像处理(DIP) - 频率域滤波7 - 二维DFT和IDFT的一些性质 - 傅里叶频谱和相角

目录二维DFT和IDFT的一些性质傅里叶频谱和相角二维DFT和IDFT的一些性质 傅里叶频谱和相角 F(u,v)R(u,v)jI(u,v)∣F(u,v)∣ejϕ(u,v)(4.86)F(u, v) R(u, v) jI(u, v) |F(u, v)|e^{j\phi(u,v)} \tag{4.86}F(u,v)R(u,v)jI(u,v)∣F(u,v)∣ejϕ(u,v)(4.86) 幅度&#xff0c;称为…

jquery 判断是否有类名_Day037-JS、jQuery

第73次(JavaScript)学习主题&#xff1a;JavaScript学习目标&#xff1a;1 掌握js的表单验证2 熟练敲出制作购物车代码,尽量不要看老师的代码1. 表单验证A(1) 如何可以产生一个4位的随机数验证码Math.floor(Math.random()*90001000)(2) 如何控制表单是否提交的通过设置form表单…

csc.exe的环境变量设置

默认情况下&#xff0c;这个路径是不在 Path 环境变量中的。你在命令行下直接输入 csc&#xff0c;windows不会到上面那个路径中去找这个程序。所以也就提示找不到文件了。 设置方法&#xff1a; 1) 在“我的电脑”上点击右键&#xff0c;现在“属性”&#xff1b; 2) 在弹出的…

如何分析解决Android ANR

[java] view plaincopy print?来自&#xff1a; http://blog.csdn.net/tjy1985/article/details/6777346 http://blog.csdn.net/tjy1985/article/details/6777355 http://blog.csdn.net/tjy1985/article/details/6777983 http://www.eoeandroid.com/forum.php?modviewthr…

第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理

目录二维DFT和IDFT的一些性质二维离散卷积定理二维离散傅里叶变换性质的小结二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式&#xff1a; (f⋆h)(x,y)∑m0M−1∑n0N−1f(m,n)h(x−m,y−n)(4.94)(f \star h)(x, y) \sum_{m0}^{M-1} \sum_{n0}^{N-1} f(m,n)h(x…

jmeter中重定向多个正则表达式_2020年jmeter技术实战续集,最新技术全栈,值得收藏

在上一篇&#xff1a;主要介绍线程组、HTTP请求默认值、用户定义的变量、固定定时器的应用场景及实战。以下主要介绍正则表达式提取器、调式取样器(Debug Sampler)、响应断言、HTTP信息头管理器的应用场景及实战。一、正则表达式提取器1、使用场景从请求的响应结果中取到需要的…