幸运的是,Python 库中内建了一些隐藏的特性,可以让我们充分利用所有 CPU 核心的能力。通过使用 Python 的 concurrent.futures 模块,我们只需要 3 行代码就可以让一个普通的程序转换成适用于多核处理器并行处理的程序。

标准方法

让我们举一个简单的例子,在单个文件夹中有一个图片数据集,其中有数万张图片。在这里,我们决定使用 1000 张。我们希望在所有图片被传递到深度神经网络之前将其调整为 600×600 像素分辨率的形式。以下是你经常会在 GitHub 上看到的标准 Python 代码:

importglob

importos

importcv2

### Loop through all jpg files in the current folder

### Resize each one to size 600x600

forimage_filename inglob.glob( "*.jpg"):

### Read in the image data

img = cv2.imread(image_filename)

### Resize the image

img = 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 实例,剩下的就交给它了!只需改变三行代码。实例:

importglob

importos

importcv2

importconcurrent.futures

defload_and_resize(image_filename):

### Read in the image data

img = cv2.imread(image_filename)

### Resize the image

img = cv2.resize(img, ( 600, 600))

### Create a pool of processes. By default, one is created for each CPU in your machine.

withconcurrent.futures.ProcessPoolExecutor asexecutor:

### Get a list of files to process

image_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 600x600

executor.map(load_and_resize, image_files)

从以上代码中摘出一行:

withconcurrent.futures.ProcessPoolExecutor asexecutor:

你的 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」一节)。

python读取mysql数据每次都耗时600秒_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍...相关推荐

  1. python读取mysql中的数据_Python笔记:用Python读取MySQL中的数据

    Python处理数据分析的优势,很多人都知道(可以实现更复杂.更灵活的操作,包括数据预处理.数据可视化输出等),但是加载到Python中的数据,只是临时存储在内存中的一张虚拟表(退出之后就会被释放掉了 ...

  2. python读取mysql中表内数据_Python读取MySQL表数据的方法介绍

    这篇文章主要为大家详细介绍了Python如何读取MySQL数据库表数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Python读取MySQL数据库表数据的具体代码,供大家参 ...

  3. python读取mysql数据_如何将mysql的数据读取python

    展开全部 本文实例为大家2113分享了Python读取MySQL数据库表数据的具体代码,5261供大家参考,具体内容4102如下 环境:Python 3.6 ,Window 64bit 目的:1653 ...

  4. python读取mysql以html形式输出_python实现处理mysql结果输出方式

    在运维过程中,经常需要读取mysql的结果输出并进行响应的处理,这节介绍如何用Python读取mysql结果表并进行相应的整理. 进行mysql结果文件输出: mysql -h10.20.10.207 ...

  5. python文件都是脚本吗_脚本语言系列之Python | Python文件IO

    Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习.语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会:Python 的极简风格对 ...

  6. python读取mysql以html形式输出_python从mysql数据库提取出来的数据怎么在html里显示...

    2017-04-06 回答 1.和数据库建立连接 2.执行sql语句,接收返回值 3.关闭数据库连接 1.mysql数据库要用mysqldb模块,但python用来链接mysql的第三方库mysqld ...

  7. 使用python读取mysql数据库并进行数据的操作

    (一)环境的配置 使用python调用mysql数据库要引进一些库. 目前我使用的python版本是python3.6.引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursq ...

  8. python网站用什么数据库_使用python读取mysql数据库并进行数据的操作

    简介:(一)环境的配置使用python调用mysql数据库要引进一些库.目前我使用的python版本是python3.6.引进库为pymysql其他对应的库可以有以下选择: mysqldb,oursq ...

  9. python读取mysql数据库行数_使用python读取mysql数据库并进行数据的操作

    (一)环境的配置 使用python调用mysql数据库要引进一些库. 目前我使用的python版本是python3.6.引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursq ...

最新文章

  1. 八大操作系统掌门人齐聚 1024 程序员节,千年岳麓见证开源新时代
  2. linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍
  3. 央视记者王冰冰为何走红?博导和研究生写了一篇论文进行了分析
  4. url get参数 php,怎么取得Url中Get参数
  5. 甲骨文谷歌继续打官司:美最高法院同意复审 Java API 版权诉讼案
  6. 多伦多大学密西莎加计算机科学,解析加国名校多伦多大学密西沙加校区
  7. (11)机器学习_Kmeans聚类算法
  8. Windows 95 输入法编辑器
  9. 金士顿DT100G3(16G) U盘修复
  10. SCC4-设置系统是否可编辑状态(后台配置)
  11. 【原创】使用高德 API
  12. BC #38 / HDU5208 Where is Bob · 数位dp
  13. 亚马逊Alexa Skill介绍
  14. java 阴阳师个人脚本
  15. 游戏场景设计思维:黑白与颜色的现代构成艺术
  16. 计算机无法识别打印机驱动,打印机连电脑,电脑说无法识别。为什么?
  17. 前端学习规划xmind
  18. 什么是数字式KVM远程管理功能
  19. codemirror 常见操作
  20. 5. (6.9~7.4)2022年自动化保研信息+分析汇总(夏令营)

热门文章

  1. 享受高成长:国内数据中心IDC全分析(附19年机柜排名)
  2. 解决微信内置网页无法上传图片的问题
  3. java .z文件_Java简单的读写文件
  4. Flash as3嵌入中文字体的方法
  5. uniapp引入vant组件
  6. html 绘制甘特图,Markdown绘制甘特图教程
  7. V8系统中不同权限的用户有不同的图标功能
  8. Allstate美国好事达保险公司理赔预测模型案例_企业科研_论文科研_毕业设计
  9. 企业微信通讯录回调请求验证及接收
  10. MySQL 5.7最新版本下载与安装教程