三行Python代码,让数据处理速度提高2到6倍

这篇具有很好参考价值的文章主要介绍了三行Python代码,让数据处理速度提高2到6倍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

三行Python代码,让数据处理速度提高2到6倍

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

import glob

import os

import cv2

import concurrent.futures



def load_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.

with concurrent.futures.ProcessPoolExecutor() as executor:

 ### 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)

从以上代码中摘出一行:

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

END文章来源地址https://www.toymoban.com/news/detail-417175.html

到了这里,关于三行Python代码,让数据处理速度提高2到6倍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】数据预处理之将类别数据转换为数值的方法(含Python代码分析)

    在进行Python数据分析的时候,首先要进行数据预处理。但是有时候不得不处理一些非数值类别的数据,遇到这类问题时该怎么解决呢? 目前为止,总结了三种方法,这里分享给大家。 这种方法是属于映射字典将类标转换为整数,不过这种方法适用范围有限。 我们首先创建一

    2024年02月09日
    浏览(59)
  • 自然语言处理与大数据:如何提高数据分析效率

    自然语言处理(NLP,Natural Language Processing)是计算机科学与人工智能领域的一个分支,研究如何让计算机理解、生成和处理人类语言。自然语言处理技术广泛应用于各个领域,包括机器翻译、语音识别、情感分析、文本摘要等。 随着数据的大量生成和存储,大数据技术已经成为

    2024年04月09日
    浏览(62)
  • 常用python代码大全-python使用json模块处理JSON数据

    在Python中, json 模块提供了一种简单的方法来编码和解码JSON数据。以下是一个简单的例子,说明如何使用 json 模块来处理JSON数据。 首先,我们需要导入 json 模块: 编码(Encode)JSON 数据 要将Python对象编码为JSON格式,我们可以使用 json.dumps() 函数。这个函数将Python对象转换为

    2024年01月20日
    浏览(63)
  • 数据建模的云计算支持:利用云计算资源提高数据处理效率

    数据建模是数据科学和机器学习领域中的一个重要环节,它涉及到将实际问题转化为数学模型的过程。随着数据规模的不断扩大,传统的数据处理方法已经无法满足需求,因此需要寻找更高效的数据处理方法。云计算是一种基于互联网的计算资源分配和共享方式,它可以提供

    2024年04月28日
    浏览(42)
  • MySQL表操作:提高数据处理效率的秘诀(进阶)(2)

    💕“学习难免有坎坷,重要的是你能尽力而为,持之以恒。”💕 🐼作者:不能再留遗憾了🐼 🎆专栏:MySQL学习🎆 🚗本文章主要内容:MySQL表操作进阶:聚合查询和联合查询🚗 前面我们学习了MySQL进阶的数据库约束、表的设计和新增,那么今天我将为大家分享MySQL表查询

    2024年02月08日
    浏览(50)
  • MySQL表操作:提高数据处理效率的秘诀(进阶)(1)

    💕**“生命不在于相信奇迹,而在于创造奇迹。”——朱学恒**💕 🐼作者:不能再留遗憾了🐼 🎆专栏:MySQL学习🎆 🚗本文章主要内容:MySQL对表操作进阶。数据库约束、表的设计、新增,后续会更新进阶表的查询🚗 前面我们已经介绍过初识MySQL以及MySQL对库和对表操作(

    2024年02月08日
    浏览(43)
  • Python 框架学习 Django篇 (八) 代码优化、数据库冗余处理

    我们开发软件系统的时候,需要不断的反思我们代码里面是否有可以优化的地方。而优化的重点之一,就是把冗余的代码优化为可以复用的库。我们在前面编写了一些功能,但是其中存在很多冗余的方法 打开这3个文件我们可以看到他们的入口函数dispatcher  实际的代码相似度

    2024年02月06日
    浏览(49)
  • 数据不平衡处理方式之过采样和欠采样(Python代码)

    sklearn.datasets.make_classification 官方地址: https://www.w3cschool.cn/doc_scikit_learn/scikit_learn-modules-generated-sklearn-datasets-make_classification.html sklearn.datasets.make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=2, n_repeated=0, n_classes=2, n_clusters_per_class=2, weights=None, flip_y=0.01, class_sep=1.0,

    2024年03月10日
    浏览(85)
  • Icesat-2 ATL13数据下载(不用python),python处理保姆式教学(附代码)

    1.数据下载(不用python) 进入官网ICESat-2 Product Overviews | National Snow and Ice Data Center (nsidc.org)  下滑找到你需要的产品,以下以ATL13为例    点击进入,找到Data Access Tool,点击get        登录自己的 Earthdade账号   准备好自己研究区域 的shp矢量图,没有的话也可以自己圈画, 

    2024年04月29日
    浏览(35)
  • 用通俗易懂的方式讲解:数据预处理归一化(附Python代码)

    本文来自技术群小伙伴的分享,想加入按照如下方式 目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友 方式①、添加微信号:dkl88191,备注:来自CSDN+技术交流 方式②、微信搜索公众号:Python学习与数据挖掘,后

    2023年04月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包