前言
- 现在有个需求是进行大批量文件copy,写完脚本,运行一下,发现速度实在太慢.
- 要优化只能加多线程,为了图方便,我第一时间想到的是tomorrow这个库.设置线程运行后,发现效率有所提升,但是感觉还是比较慢,最后使用pyton标准库concurrent.futures比较了一下.发现concurrent快好多.
- 话不多说,上代码.
实践
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25def test_path():
pool = Pool(max_workers=5) // 设置线程池
src = r'I:\wbdata\TA'
dst = r'C:\Users\axzq\Desktop\新建文件夹\ta'
for path in os.listdir(src):
if not os.path.isdir(src+'\\'+path):
print(f'{path}不是目录')
continue
Keyword = '申请表'
if Keyword in str(os.listdir(src+'\\'+path)):
new_src = src + '\\' + path + '\\' + Keyword
if not os.path.exists(new_src):
print(f'文件 or 目录不存在')
continue
for file in os.listdir(new_src):
print(f'{new_src}\\{file} ----> {dst}')
pool.map(copy1, (f'{new_src}\\{file}', dst)) //执行线程
print('复制完成')
@threads(5) //使用tomorrow
def copy1(src, dst):
try:
shutil.copy(f'{src}', dst)
except PermissionError:
print(f'{src} 无权限...')
1 | concurrent运行时间: 10.266663789749146 |
结语
1.公司电脑,配置有点渣,
2.tomorrow是封装的concurrent,讲道理性能不应该差这么多,我个人感觉是因为使用装饰器的原因.在一个是没封装好.
3.Python装饰器本质是一个函数,通过闭包实现(应用外部变量的内部函数).
4.具体原因我也不知道,希望有懂得的同学,能指点一下原因.谢谢了.