2024年Python最新仅用3行Python代码即可让数据脚本提升4倍的速度!_python3

创建和保存缩略图

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


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


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


 


电脑有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


接着,我们需要告诉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 glob
import os
from PIL import Image
import 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}")


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



### 最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~  

给大家准备的学习资料包括但不限于:  

Python 环境、pycharm编辑器/永久激活/翻译插件  

python 零基础视频教程  

Python 界面开发实战教程  

Python 爬虫实战教程  

Python 数据分析实战教程  

python 游戏开发实战教程  

Python 电子书100本  

Python 学习路线规划

![](https://img-blog.csdnimg.cn/d29631674929476f9c3b30f7ff58dff0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值