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个还没领到任务,第一个的任务就结束了,这就导致不可能每一个线程都在同时跑任务,由此可见线程也不是越多越好