1.多线程来读取多个文件,缩减运行时间,提高效率
以读取json文件为例,
单个线程读取文件
python
import time
import os
import json
from pathlib import Path
class ReadNumerousFile:
def __init__(self, file_path):
# 文件路径
self.file_path = file_path
def read_file(self, file_li):
# os.path.join() 替换成 Path().joinpath()
for file in file_li:
print(Path().joinpath(self.file_path, file))
with open(Path().joinpath(self.file_path, file), 'r', encoding='utf-8') as f:
josn_obj = json.load(f)
if josn_obj:
print(josn_obj[0])
if __name__ == '__main__':
start = time.time()
source_path = r'D:\File\EVERY_MONTH_TASK\2023\tech_file\outputs'
file_list = os.listdir(source_path) # 获取路径下文件列表
if file_list:
r_obj = ReadNumerousFile(source_path)
r_obj.read_file(file_list)
end = time.time()
print('程序运行了%s' % (end - start))
程序运行了0.9743776321411133
多线程读取文件
python
import time
import os
import json
from pathlib import Path
import threading
class ReadNumerousFile:
def __init__(self, file_path):
self.file_path = file_path
def read_file(self, file_li):
# os.path.join() 替换成 Path().joinpath()
for file in file_li:
print(Path().joinpath(self.file_path, file))
with open(Path().joinpath(self.file_path, file), 'r', encoding='utf-8') as f:
josn_obj = json.load(f)
if josn_obj:
print(josn_obj[0])
if __name__ == '__main__':
start = time.time()
source_path = r'D:\File\EVERY_MONTH_TASK\2023\tech_file\outputs'
file_list = os.listdir(source_path)
n = 300 # 每个线程处理的文件数
threads = [] # 线程列表
if file_list:
list_all = [file_list[i:i + n] for i in range(0, len(file_list), n)]
# 按300来切分文件列表
r_obj = ReadNumerousFile(source_path)
for part_file_list in list_all:
t = threading.Thread(target=r_obj.read_file, args=(part_file_list,)) # 创建线程
threads.append(t) # 加入线程列表
t.start() # 启动线程
for thr in threads:
thr.join() # 等待所有子线程结束
end = time.time()
print('程序运行了%s秒' % (end - start))
程序运行了0.4763674736022949
对比两种方式的运行时间,明显多线程时间快了1倍