Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺寸,用Python没问题!你几乎总是能找到一款可以轻松完成数据处理工作的Python库。小可爱,加下我微信:mengy7762
领取以下福利
1、python安装包
2、程序员电子书籍:5本-10本
3、python项目源码三份:(python破解WiFi密码、VIP视频权限破解、爬虫自动化)
4、基础学习PPT教案
5、免费课程(开课时间15:00、19:30、20:30)自由选择
6、程序员职业规划分享
7、空余时间接单赚钱方法

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

今天我(作者Adam Geitgey——译者注)就教大家怎样通过并行运行Python函数,充分利用你的电脑的全部处理能力。得益于Python的 concurrent.futures 模块,我们只需3行代码,就能将一个普通数据处理脚本变为能并行处理数据的脚本,提速4倍。

初学者有什么不懂的可以私信我——我刚整理了一套2021最新的0基础入门教程,无私分享,获取方法:关注小编,发私信:【学习资料】 即可获取,内附:开发工具和安装包,以及系统学习路线图。

普通Python处理数据方法

比方说,我们有一个全是图像数据的文件夹,想用Python为每张图像创建缩略图。

下面是一个短暂的脚本,用Python的内置glob函数获取文件夹中所有JPEG图像的列表,然后用Pillow图像处理库为每张图像保存大小为128像素的缩略图:

这段脚本沿用了一个简单的模式,你会在数据处理脚本中经常见到这种方法:

首先获得你想处理的文件(或其它数据)的列表

写一个辅助函数,能够处理上述文件的单个数据

使用for循环调用辅助函数,处理每一个单个数据,一次一个。

咱们用一个包含1000张JPEG图像的文件夹测试一下这段脚本,看看运行完要花多长时间:

运行程序花了8.9秒,但是电脑的真实工作强度怎样呢?

我们再运行一遍程序,看看程序运行时的活动监视器情况:

电脑有75%的处理资源处于闲置状态!这是什么情况?

这个问题的原因就是我的电脑有4个CPU,但Python只使用了一个。所以程序只是卯足了劲用其中一个CPU,另外3个却无所事事。因此我需要一种方法能将工作量分成4个我能并行处理的单独部分。幸运的是,Python中有个方法很容易能让我们做到!最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:mengy7762 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

试试创建多进程

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

1.将JPEG文件划分为4小块。 2.运行Python解释器的4个单独实例。 3.让每个Python实例处理这4块数据中的一块。 4.将这4部分的处理结果合并,获得结果的最终列表。

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

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

首先,我们需要导入concurrent.futures库,这个库就内置在Python中:

import concurrent.futures

接着,我们需要告诉Python启动4个额外的Python实例。我们通过让Python创建一个Process Pool来完成这一步:

with concurrent.futures.ProcessPoolExecutor() as executor:

默认情况下,它会为你电脑上的每个CPU创建一个Python进程,所以如果你有4个CPU,就会启动4个Python进程。

最后一步是让创建的Process Pool用这4个进程在数据列表上执行我们的辅助函数。完成这一步,我们要将已有的for循环:

该executor.map()函数调用时需要输入辅助函数和待处理的数据列表。这个函数能帮我完成所有麻烦的工作,包括将列表分为多个子列表、将子列表发送到每个子进程、运行子进程以及合并结果等。干得漂亮!

这也能为我们返回每个函数调用的结果。Executor.map()函数会按照和输入数据相同的顺序返回结果。所以我用了Python的zip()函数作为捷径,一步获取原始文件名和每一步中的匹配结果。

这里是经过这三步改动后的程序代码:

我们来运行一下这段脚本,看看它是否以更快的速度完成数据处理:

脚本在2.2秒就处理完了数据!比原来的版本提速4倍!之所以能更快的处理数据,是因为我们使用了4个CPU而不是1个。

但是如果你仔细看看,会发现“用户”时间几乎为9秒。那为何程序处理时间为2.2秒,但不知怎么搞得运行时间还是9秒?这似乎不太可能啊?

这是因为“用户”时间是所有CPU时间的总和,我们最终完成工作的CPU时间总和一样,都是9秒,但我们使用4个CPU完成的,实际处理数据时间只有2.2秒!

注意:启用更多Python进程以及给子进程分配数据都会占用时间,因此靠这个方法并不能保证总是能大幅提高速度。如果你要处理非常大的数据集,这里有篇设置将数据集切分成多少小块的文章,可以读读,会对你帮助甚大.

这种方法总能帮我的数据处理脚本提速吗?

如果你有一列数据,并且每个数据都能单独处理时,使用我们这里所说的Process Pools是一个提速的好方法。下面是一些适合使用并行处理的例子:

从一系列单独的网页服务器日志里抓取统计数据。

从一堆XML,CSV和JSON文件中解析数据。

对大量图片数据做预处理,建立机器学习数据集。

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

同时,也无法按照一个预想的顺序处理数据。如果你需要前一步的处理结果来进行下一步,这种方法也行不通。

那GIL的问题呢?

你可能知道Python有个叫全局解释器锁(Global Interpreter Lock)的东西,即GIL。这意味着即使你的程序是多线程的,每个线程也只能执行一个Python指令。GIL确保任何时候都只有一个Python线程执行。换句话说,多线程的Python代码并不能真正地并行运行,从而无法充分利用多核CPU。

但是Process Pool能解决这个问题!因为我们是运行单独的Python实例,每个实例都有自己的GIL。这样我们获得是真正能并行处理的Python代码!

不要害怕并行处理!

有了concurrent.futures库,Python就能让你简简单单地修改一下脚本后,立刻让你电脑上所有CPU投入到工作中。不要害怕尝试这种方法,一旦你掌握了,它就跟一个for循环一样简单,却能让你的数据处理脚本快到飞起。

有轻功:用3行代码让Python数据处理脚本获得4倍提速相关推荐

  1. python 数据比对 函数_1行代码实现Python数据分析:图表美观清晰,自带对比功能丨开源...

    原标题:1行代码实现Python数据分析:图表美观清晰,自带对比功能丨开源

  2. python代码翻译-10 行代码,Python 教你自制屏幕翻译工具,有逼格!!

    原标题:10 行代码,Python 教你自制屏幕翻译工具,有逼格!! 1. 场景 大家如果平常遇到不认识的英文,相信大部分的人都会复制内容后,使用翻译软件,或者拷贝到网站上去执行翻译. 当然,对于 I ...

  3. python爬虫代码1000行-最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  4. 最简单的爬虫代码 python_最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  5. python代码翻译器-10 行代码,Python 教你自制屏幕翻译工具,有逼格!!

    原标题:10 行代码,Python 教你自制屏幕翻译工具,有逼格!! 1. 场景 大家如果平常遇到不认识的英文,相信大部分的人都会复制内容后,使用翻译软件,或者拷贝到网站上去执行翻译. 当然,对于 I ...

  6. python简单爬虫代码-最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  7. 用python画苹果的logo_简单几步,100行代码用Python画一个蝙蝠侠的logo

    转自:菜鸟学Python 简单几步,100行代码用Python画一个蝙蝠侠的logo-1.jpg (35.33 KB, 下载次数: 0) 2020-7-30 12:04 上传 蝙蝠侠作为DC漫画的核心 ...

  8. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  9. python代码示例500行源代码-500行代码使用python写个微信小游戏飞机大战游戏

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...

最新文章

  1. linux ls没有反应_Linux入门②“命令格式”
  2. 如何办理夫妻间的房屋产权转移手续?
  3. Tableau实战系列浏览 Tableau 环境(八) -tableau文件类型、语言和区域设置以及图标
  4. 【专栏原创]】忘掉一切,从用户场景出发——我在需求上犯过的错
  5. 如何开启/关闭SMTP路由调试
  6. python 三维向量 交互_Blender实现Nature of Code1.5单位向量[Nature of Node 004]
  7. 前端学习(1341):mongoose验证规则延伸
  8. sqlite3数据库使用
  9. TensorFlow入门--实现多层感知机
  10. 图解 | 什么是缓存系统“三座大山”?
  11. 乐播投屏显示服务器错误是什么意思,乐播投屏怎么用 乐播投屏常见问题汇总分享...
  12. CentOS7 建立静态 IP(eth0)
  13. 糖尿病11年的隔壁老王
  14. 我逢人就吹的超好用Markdown编辑器-Typora
  15. Linux学习笔记_2021-01-21
  16. CXF框架发布WebService服务的例子
  17. 游戏服务器设计之观察者模式
  18. 医咖会SPSS免费教程学习笔记—单样本T检验
  19. 工具推荐:eMule,中文名电骡,P2P下载软件之一。我觉得如果你上网没有用过电骡一种缺憾...
  20. 解决暴力摩托等在win7不能玩的问题,Windows7游戏花屏通用补丁 1.2

热门文章

  1. linux用于电脑,适用于 Linux的Windows子系统正在获得这些有用的新功能的介绍
  2. mysql入参映射_Mybatis中的Mapper映射Sql中传参类型(如Bean,基本类型,List...)与取值的方式 与foreach的几种用法!!...
  3. 计算机应用基础多媒体应用试题,计算机等级考试:计算机应用基础复习题
  4. linux添加硬盘不重启(vmware下或者虚拟机下面)
  5. 用计算机探索规律的ppt,用计算机探索规律.ppt
  6. php inner.html,javascript – PHP:如何获得CURRENT innerHTML?
  7. python 录入数据不重复_pythonDjango批量导入不重复数据
  8. java(线程池的创建方式,和线程池的原理)
  9. 机器学习中的度量——字符串距离
  10. 【LOJ】#3030. 「JOISC 2019 Day1」考试