杭州公司网站制作驻马店网站建设公司
news/
2025/9/22 23:46:28/
文章来源:
杭州公司网站制作,驻马店网站建设公司,媒体网站模版,太原做网站费用选自TowardsDataScience作者#xff1a;George Seif本文转自机器之心(nearhuman2014)本文可以教你仅使用 3 行代码#xff0c;大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言#xff0c;它易于使用#xff0c;也有很多出色的库来帮助你更快处理数据。但…选自TowardsDataScience作者George Seif本文转自机器之心(nearhuman2014)本文可以教你仅使用 3 行代码大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言它易于使用也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时一些问题就会显现……在默认情况下Python 程序是单个进程使用单 CPU 核心执行。而大多数当代机器学习硬件都至少搭载了双核处理器。这意味着如果没有进行优化在数据预处理的时候会出现「一核有难九核围观」的情况——超过 50% 的算力都会被浪费。在当前四核处理器(英特尔酷睿 i5)和 6 核处理器(英特尔酷睿 i7)大行其道的时候这种情况会变得更加明显。幸运的是Python 库中内建了一些隐藏的特性可以让我们充分利用所有 CPU 核心的能力。通过使用 Python 的 concurrent.futures 模块我们只需要 3 行代码就可以让一个普通的程序转换成适用于多核处理器并行处理的程序。标准方法让我们举一个简单的例子在单个文件夹中有一个图片数据集其中有数万张图片。在这里我们决定使用 1000 张。我们希望在所有图片被传递到深度神经网络之前将其调整为 600×600 像素分辨率的形式。以下是你经常会在 GitHub 上看到的标准 Python 代码import globimport osimport cv2### Loop through all jpg files in the current folder ### Resize each one to size 600x600for 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 globimport osimport cv2import concurrent.futuresdef 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」一节)。原文链接https://towardsdatascience.com/heres-how-you-can-get-a-2-6x-speed-up-on-your-data-pre-processing-with-python-847887e63be5
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910780.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!