iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么写Python代码提高数据处理脚本速度
  • 256
分享到

怎么写Python代码提高数据处理脚本速度

2023-06-29 08:06:06 256人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“怎么写python代码提高数据处理脚本速度”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么写Python代码提高数据处理脚本速度”文章能帮助大家解决问题。普通Python处理数据

这篇文章主要介绍“怎么写python代码提高数据处理脚本速度”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么写Python代码提高数据处理脚本速度”文章能帮助大家解决问题。

普通Python处理数据方法

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

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

import globimport osfrom PIL import Imagedef make_image_thumbnail(filename):     # 缩略图会被命名为"<original_filename>_thumbnail.jpg"     base_filename, file_extension = os.path.splitext(filename)     thumbnail_filename = f"{base_filename}_thumbnail{file_extension}"     # 创建和保存缩略图     image = Image.open(filename)     image.thumbnail(size=(128, 128))     image.save(thumbnail_filename, "JPEG")     return thumbnail_filename   # 循环文件夹中所有JPEG图像,为每张图像创建缩略图 for image_file in glob.glob("*.jpg"):     thumbnail_file = make_image_thumbnail(image_file)  print(f"A thumbnail for {image_file} was saved as {thumbnail_file}")

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

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

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

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

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

$ time python3 thumbnails_1.pyA thumbnail for 1430028941_4db9dedd10.jpg was saved as 1430028941_4db9dedd10_thumbnail.jpg[... about 1000 more lines of output ...]real 0m8.956suser 0m7.086s sys 0m0.743s

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

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

怎么写Python代码提高数据处理脚本速度

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

这个问题的原因就是我的电脑有4个CPU,但Python只使用了一个。所以程序只是卯足了劲用其中一个CPU,另外3个却无所事事。

因此我需要一种方法能将工作量分成4个我能并行处理的单独部分。幸运的是,Python中有个方法很容易能让我们做到!

试试创建多进程

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

  • 将JPEG文件划分为4小块。

  • 运行Python解释器的4个单独实例。

  • 让每个Python实例处理这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循环:

for image_file in glob.glob("*.jpg"):thumbnail_file = make_image_thumbnail(image_file)

替换为新的调用executor.map():

 image_files = glob.glob("*.jpg") for image_file, thumbnail_file in zip(image_files,executor.map(make_image_thumbnail, image_files)):

该executor.map()函数调用时需要输入辅助函数和待处理的数据列表。

这个函数能帮我完成所有麻烦的工作,包括将列表分为多个子列表、将子列表发送到每个子进程、运行子进程以及合并结果等。干得漂亮!

这也能为我们返回每个函数调用的结果。

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

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

import globimport osfrom PIL import Imageimport concurrent.futures      def make_image_thumbnail(filename):     # 缩略图会被命名为 "<original_filename>_thumbnail.jpg"      base_filename, file_extension = os.path.splitext(filename)     thumbnail_filename = f"{base_filename}_thumbnail{file_extension}"      # 创建和保存缩略图     image = Image.open(filename)     image.thumbnail(size=(128, 128))     image.save(thumbnail_filename, "JPEG")      return thumbnail_filename   # 创建Process Pool,默认为电脑的每个CPU创建一个 with concurrent.futures.ProcessPoolExecutor() as executor:     # 获取需要处理的文件列表     image_files = glob.glob("*.jpg")      # 处理文件列表,但通过Process Pool划分工作,使用全部CPU!     for image_file, thumbnail_file in zip(image_files, executor.map(make_image_thumbnail, image_files)):         print(f"A thumbnail for {image_file} was saved as {thumbnail_file}")

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

 $ time python3 thumbnails_2.py A thumbnail for 1430028941_4db9dedd10.jpg was saved as 1430028941_4db9dedd10_thumbnail.jpg [... about 1000 more lines of output ...] real 0m2.274s user 0m8.959s sys 0m0.951s

脚本在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投入到工作中。

关于“怎么写Python代码提高数据处理脚本速度”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网Python频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 怎么写Python代码提高数据处理脚本速度

本文链接: https://www.lsjlt.com/news/323744.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么写Python代码提高数据处理脚本速度
    这篇文章主要介绍“怎么写Python代码提高数据处理脚本速度”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么写Python代码提高数据处理脚本速度”文章能帮助大家解决问题。普通Python处理数据...
    99+
    2023-06-29
  • 三行Python代码提高数据处理脚本速度
    Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调...
    99+
    2024-04-02
  • Pandas 多进程处理数据提高速度
    目录1、单进程2、多进程前言: python 有自己的多进包 multiprocessing 去实现并行计算,但在Pandas处理数据中,使用 multiprocessing 并不好...
    99+
    2024-04-02
  • 云服务器处理速度怎么提高
    提高云服务器的处理速度可以通过以下几种方法:1. 优化服务器配置:确保服务器的处理器、内存和存储等硬件设施足够强大,以满足应用程序的...
    99+
    2023-08-28
    云服务器
  • 怎么提升python代码的运行速度
    这篇文章给大家介绍怎么提升python代码的运行速度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写...
    99+
    2023-06-14
  • 怎么使用Python缓存提高数据访问速度
    Python使用缓存在开发Web应用或分布式系统时,缓存是常见的解决方案之一,它可以大幅提升系统性能。在Python中,我们可以使用内存缓存(例如使用functools.lru_cache)或者外部存储(例如使用Redis)来实现缓存功能。...
    99+
    2023-05-15
    Python
  • 怎么编写Python代码让数据处理快4倍
    这篇文章主要介绍“怎么编写Python代码让数据处理快4倍”,在日常操作中,相信很多人在怎么编写Python代码让数据处理快4倍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么编写Python代码让数据处理...
    99+
    2023-06-16
  • 可加速你的编码速度Python脚本是怎么样的
    这篇文章将为大家详细讲解有关可加速你的编码速度Python脚本是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们向您介绍一些提示和技巧,以帮助您更快地编写代码Python的可读性和...
    99+
    2023-06-16
  • Python得到代码执行时间脚本怎么写
    Python得到代码执行时间脚本怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。得到代码执行时间脚本:import timet0 = time.time()...
    99+
    2023-06-04
  • Linux系统下的大数据处理,Python编程算法能否帮助提高数据处理速度?
    随着科技的不断发展,大数据处理已经成为了当今社会中的一个重要课题。在这个领域中,Linux系统是一个非常受欢迎的选择,因为它提供了强大的性能和可靠性。同时,Python编程语言也是一个备受青睐的选择,因为它具有易学易用、功能强大的特点。那么...
    99+
    2023-08-11
    linux 大数据 编程算法
  • PHP7中的生成器:如何高效地处理大规模数据和提升代码执行速度?
    PHP7中的生成器:如何高效地处理大规模数据和提升代码执行速度?在开发应用程序时,我们经常需要处理大规模的数据集合。传统的方式是将所有数据加载到内存中,这在处理大量数据时可能会导致内存不足的问题。为了解决这个问题,PHP7引入了生成器(Ge...
    99+
    2023-10-22
    生成器 (Generator) 执行速度 (Execution Speed) 大规模数据 (Big Data)
  • Numpy库常用函数大全:优化代码,加速数据处理速度
    Numpy库是Python中一个重要的科学计算库,它提供了高效的多维数组对象以及丰富的函数库,可以帮助我们更加高效地进行数值计算和数据处理。本文将介绍一系列Numpy库中常用的函数,以及如何使用这些函数优化代码,加速数据处理速度...
    99+
    2024-01-19
    numpy库 数据加速 函数优化
  • 编程算法能否提高ASP对大数据的处理速度?
    ASP是一种常用的Web开发语言,随着大数据时代的到来,对于ASP对大数据的处理速度也越来越被关注。在这篇文章中,我们将探讨编程算法是否能够提高ASP对大数据的处理速度,并展示一些实用的代码示例。 一、ASP对大数据的处理速度 ASP作为...
    99+
    2023-10-04
    响应 大数据 编程算法
  • python遍历迭代器自动链式处理数据的代码怎么写
    python遍历迭代器自动链式处理数据的代码怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python遍历迭代器自动链式处理数据pytorch.utils.data可兼容...
    99+
    2023-06-26
  • PHP 容器优化:如何提高大数据处理的响应速度?
    在现代互联网应用中,数据处理是一个不可避免的问题。无论是在电子商务网站还是社交媒体平台,处理大量数据的需求都非常高。PHP 作为一种流行的服务器端编程语言,通常用于处理用户数据和生成动态网页。但是,在处理大量数据时,PHP 的性能可能会受...
    99+
    2023-06-15
    容器 响应 大数据
  • Vue处理循环数据流程的代码怎么写
    这篇文章主要介绍了Vue处理循环数据流程的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue处理循环数据流程的代码怎么写文章都会有所收获,下面我们一起来看看吧。下面就展示使用vue处理循环的一个例子...
    99+
    2023-07-06
  • PHP7中的生成器:如何高效地处理大量数据和加速代码执行速度?
    PHP7中的生成器:如何高效地处理大量数据和加速代码执行速度?随着互联网的发展,我们面对的数据量越来越庞大,针对大量数据的处理成为了开发人员的一项重要任务。而在PHP7中引入了生成器(Generator),它为我们提供了一种高效地处理大量数...
    99+
    2023-10-22
    生成器 加速 大量数据
  • 怎么编写js函数来提高代码的质量
    这篇文章主要介绍了怎么编写js函数来提高代码的质量的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么编写js函数来提高代码的质量文章都会有所收获,下面我们一起来看看吧。函数是实现程序功能的最基本单位,每一个程序...
    99+
    2023-06-17
  • PHP7中的生成器:如何高效地处理大量数据和加速代码的执行速度?
    PHP7中的生成器:如何高效地处理大量数据和加速代码的执行速度?概述:在PHP7中,引入了生成器(Generator)的概念,它是一种特殊的函数,可以按需生成数据流。生成器的出现在处理大量数据和提高代码执行速度方面,提供了一个非常有效的解决...
    99+
    2023-10-22
    生成器 数据处理 高效
  • Python读取Hive数据库代码怎么写
    今天小编给大家分享一下Python读取Hive数据库代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实际业务读取hi...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作