python图片横竖屏分类(采用线程池提高效率)

项目场景:

最近又刚刚从网上爬了一批图片,但是是横竖屏混在一起的,简单写了个程序用于将两者分类,本来这些没什么技术含量,但这次博主算是勉强学会了多线程操作(以前一直都不会,都是单线程,效率很低),所以特此记录一下。
此次要对大该三万张图片分类。

源代码:

单线程
代码行数并不多,简单分析一下

#导入需要的库
import os
from PIL import Image
import shutil
from concurrent.futures import ThreadPoolExecutor,as_completed
import time

#获取图片并传递图片路径和信息
def getsize(i):
    img=Image.open(i)
    w=img.width
    h=img.height
    #关闭图片(很重要)
    img.close()
    #移动图片
    move(i, w, h)

#移动图片
def move(i,w,h):
    if w>h:
        shutil.move(i,'./width')
    else:
        shutil.move(i,'./heigth')

def main():
	#记录开始时间
    start=time.time()
    #图片目标目录
    file='./bt/'
    #获取图片名称
    ls=os.listdir(file)
    #创建两类文件夹
    os.mkdir('./width')
    os.mkdir('./heigth')
    for i in ls:
    	#遍历每一个图片
        getsize(file+i)
    # with ThreadPoolExecutor(max_workers=16)as executor:
    #     future_list = []
    #     for i in ls:
    #         future = executor.submit(getsize, file+i)
    #         future_list.append(future)
    #     as_completed(future_list)
    #结束时间
    end = time.time()
    #打印运行时间
    print(end - start)

main()

附上结果图
在这里插入图片描述
多线程
源码

#将图片横竖屏分类

import os
from PIL import Image
import shutil
from concurrent.futures import ThreadPoolExecutor,as_completed
import time

def getsize(i):
    img=Image.open(i)
    w=img.width
    h=img.height
    img.close()
    move(i, w, h)

def move(i,w,h):
    if w>h:
        shutil.move(i,'./width')
    else:
        shutil.move(i,'./heigth')

def main():
    start=time.time()
    file='./bt/'
    ls=os.listdir(file)
    os.mkdir('./width')
    os.mkdir('./heigth')
    # for i in ls:
    #     getsize(file+i)
    #创建线程池,最大线程数为16(可自行更改)
    with ThreadPoolExecutor(max_workers=16)as executor:
    	#列表用于存储线程
        future_list = []
        for i in ls:
        	#使用submit提交函数和参数并存储到列表中
            future = executor.submit(getsize,file+i)
            future_list.append(future)
        #当线程全部结束时才能执行,否则会阻塞进程
        as_completed(future_list)
    end = time.time()
    print(end - start)

main()

附上结果,很明显速度并没有达到16倍。
在这里插入图片描述
这个简单说一下,是因为处理一次分类非常快,每一个线程挨个领任务。第16个还没领到任务,第一个的任务就结束了,这就导致不可能每一个线程都在同时跑任务,由此可见线程也不是越多越好

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值