返回顶部
首页 > 资讯 > 后端开发 > Python >只用3行代码,让Python提速4倍!最
  • 108
分享到

只用3行代码,让Python提速4倍!最

代码Python 2023-01-31 07:01:23 108人浏览 安东尼

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

摘要

python是一门非常适合处理数据和自动化完成重复性工作的编程语言。我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺寸,用Python没问题!你几乎总是能找

python是一门非常适合处理数据和自动化完成重复性工作的编程语言。我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺寸,用Python没问题!你几乎总是能找到一款可以轻松完成数据处理工作的Python库。

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

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

普通Python处理数据方法

▲▲▲

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

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

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
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}")

只用3行代码,让Python提速4倍!最强辅助

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

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

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

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

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

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

只用3行代码,让Python提速4倍!最强辅助

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

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

只用3行代码,让Python提速4倍!最强辅助

只用3行代码,让Python提速4倍!最强辅助

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

这个问题的原因就是我的电脑有4个CPU,但Python只使用了一个。所以程序只是卯足了劲用其中一个CPU,另外3个却无所事事。因此我需要一种方法能将工作量分成4个我能并行处理的单独部分。幸运的是,Python中有个方法很容易能让我们做到!

试试创建多进程

▲▲▲

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

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

只用3行代码,让Python提速4倍!最强辅助

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

with concurrent.futures.ProcessPoolExecutor() as executor:

只用3行代码,让Python提速4倍!最强辅助

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

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

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

只用3行代码,让Python提速4倍!最强辅助

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

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

只用3行代码,让Python提速4倍!最强辅助

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

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

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

import globimport osfrom PIL import Imageimport concurrent.futuresdef 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}")

只用3行代码,让Python提速4倍!最强辅助

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

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
$ 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

只用3行代码,让Python提速4倍!最强辅助

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

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

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

注意:启用更多Python进程以及给子进程分配数据都会占用时间,因此靠这个方法并不能保证总是能大幅提高速度。

总能帮我的数据处理脚本提速吗?

如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的。交流经验。从基础的python脚本到web开发爬虫Django数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 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循环一样简单,却能让你的数据处理脚本快到飞起。

--结束END--

本文标题: 只用3行代码,让Python提速4倍!最

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

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

猜你喜欢
  • 只用3行代码,让Python提速4倍!最
    Python是一门非常适合处理数据和自动化完成重复性工作的编程语言。我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺寸,用Python没问题!你几乎总是能找...
    99+
    2023-01-31
    代码 Python
  • 只需要这一行代码就能让python计算速度提高十倍
    目录一、前言二、Python的JIT编译器三、Numba快速学习四、关于使用五、实验提升一、前言 Python语言近年来人气爆棚。它广泛应用于数据科学,人工智能,以及网络安全问题中,...
    99+
    2024-04-02
  • 怎么让Python运行速度提高100倍
    这篇文章主要介绍“怎么让Python运行速度提高100倍”,在日常操作中,相信很多人在怎么让Python运行速度提高100倍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么让Python运行速度提高100倍...
    99+
    2023-06-17
  • 利用numba让python速度提升百倍
    目录一、什么是numba?二、numba适合科学计算三、学习使用numba四、numba让python飞起来前言; python由于它动态解释性语言的特性,跑起代码来相比java、c...
    99+
    2024-04-02
  • 怎么编写Python代码让数据处理快4倍
    这篇文章主要介绍“怎么编写Python代码让数据处理快4倍”,在日常操作中,相信很多人在怎么编写Python代码让数据处理快4倍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么编写Python代码让数据处理...
    99+
    2023-06-16
  • 几行代码让Python函数执行快30倍
    目录1、Python 多线程处理的基本指南2、多处理入门3、它为什么如此重要?4、实现5、基准测试Python 是一种流行的编程语言,也是数据科学社区中最受欢迎的语言。与其他流行编程...
    99+
    2024-04-02
  • 如何用Python代码将运行效率提升17倍
    这期内容当中小编将会给大家带来有关如何用Python代码将运行效率提升17倍,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Mandelbrot集是一个涉及位运算、递归和虚...
    99+
    2024-04-02
  • 3行代码实现 Python 并行处理,速
    来源 | towardsdatascience.com 编译 | 数说君 出品 | 数说工作室 原标题:Here’s how you can get a 2–6x speed-up on your data pre-processing...
    99+
    2023-01-31
    代码 Python
  • 怎么让Python代码加速运行
    本篇内容介绍了“怎么让Python代码加速运行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0. 代码优化原则本文会介绍不少的 Python...
    99+
    2023-06-16
  • 怎么用一行代码让gevent爬虫提速100%
    这篇文章主要介绍“怎么用一行代码让gevent爬虫提速100%”,在日常操作中,相信很多人在怎么用一行代码让gevent爬虫提速100%问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用一行代码让geven...
    99+
    2023-06-16
  • Python 3行代码提取音乐高潮部分
    目录1.原理简介2.代码编写2.1 安装所需要的项目2.2 编写代码3.效果检验4.批量提取前言: 有些时候,为了设定手机铃声或者发抖音视频,我们会耗费大量时间在剪辑音乐高潮部分上。...
    99+
    2024-04-02
  • 怎么提升python代码的运行速度
    这篇文章给大家介绍怎么提升python代码的运行速度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写...
    99+
    2023-06-14
  • 提取视频中的音频 Python只需要三行代码!
    身处数据爆炸增长的信息时代,各种各样的数据都飞速增长,视频数据也不例外。我们可以使用 python 来提取视频中的音频,而这仅仅需要安装一个体量很小的 python 库,然后执行三行代码! 语音数据在数据分析领域极为...
    99+
    2022-06-02
    python 提取音频 python 提取视频中的音频
  • 提升 Python 代码运行速度的6个技巧
    其实,Python 比我们想象的运行的要快。我们之所以有先入为主的认为Python运行慢,可能是我们平常的误用和缺乏使用技巧知识。 接下来让我们看看如何用一些简单的Trick来提高我...
    99+
    2024-04-02
  • 三行Python代码提高数据处理脚本速度
    Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调...
    99+
    2024-04-02
  • Python只用40行代码编写的计算器实例
    本文实例讲述了Python只用40行代码编写的计算器。分享给大家供大家参考,具体如下: 效果图: 代码: from tkinter import * reset=True def buttonCall...
    99+
    2022-06-04
    计算器 实例 代码
  • 只用20行Python代码实现屏幕录制功能
    目录一、模块安装二、设计思路三、代码实现四、运行方法五、完整代码六、故事结尾一、模块安装 首先,我们需要用到两个python的两个模块,win32gui和PyQt5 1.pip in...
    99+
    2024-04-02
  • Python还能这么玩之只用30行代码从excel提取个人值班表
    目录一、查找操作二、安装 openpyxl 模块三、读取并筛选值班表中自己的信息四、创建自己的值班信息表五、全部代码六、执行结果七、总结一、查找操作 Excel 模块 xlrd,xlwt,xlutils 分别负责 E...
    99+
    2022-06-02
    Python从excel提取个人值班表 python excel
  • 女神相册密码忘记了 我只用Python写了20行代码
    视频地址 我用20行代码,帮女神破解相册密码 一、事情是这样的 今早上班,公司女神小姐姐说,她去年去三亚旅游的照片打不开了 好奇问了一下才知道。 原来是,她把照片压缩了,而且还加了...
    99+
    2024-04-02
  • 只用50行Python代码爬取网络美女高清图片
    目录一、技术路线二、获取网页信息三、网页爬取分析四、网页详情页链接获取五、依据图片链接保存图片六、main()函数七、完整代码一、技术路线 requests:网页请求 Beautif...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作