python开线程处理-爱代码爱编程
# -*- coding: utf-8 -*-
import os
import time
import numpy as np
import threading
from imutils import paths
import xml.etree.ElementTree as ET
def parse_xml(xml_file):
tree = ET.parse(xml_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
bbox = []
# 这里需要注意下,迭代某个节点,需要用 root.iter('对应的节点')
for obj in root.iter('object'):
cls = obj.find('name').text
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('ymin').text), float(xmlbox.find('xmax').text),
float(xmlbox.find('ymax').text))
bbox.append([val for val in b])
return bbox
def writeTxt(input_list, save_root, start=0, out_list=[]):
for index, in_file in enumerate(input_list):
ret_box = parse_xml(in_file)
fname = os.path.split(in_file)[1].split('.')[0] + '.txt'
txt_path = os.path.join(save_root, fname)
with open(txt_path, 'w') as f:
for box in ret_box:
f.write(' '.join([str(val) for val in box]))
out_list[start+index] = ret_box
def run():
xml_root = r'D:\data\test-data\trainxml'
save_root = r'D:\data\test-data\thread-txt'
xml_all = list(paths.list_files(xml_root, '.xml'))
xml_num = len(xml_all)
out_ret = [0] * xml_num
thread_num = 8
each_num = np.ceil(xml_num / thread_num).astype(np.int)
for i in range(thread_num):
start_index = i * each_num
end_idex = i * each_num + each_num
if i == (thread_num-1):
writeTxt(xml_all[start_index:end_idex], save_root, start_index, out_ret)
else:
writeTxt(xml_all[start_index:], save_root, start_index, out_ret)
def thread_run():
xml_root = r'D:\data\test-data\trainxml'
save_root = r'D:\data\test-data\thread-txt'
xml_all = list(paths.list_files(xml_root, '.xml'))
xml_num = len(xml_all)
out_ret = [0] * xml_num
thread_num = 8
each_num = np.ceil(xml_num / thread_num).astype(np.int)
thread_list =[]
for i in range(thread_num):
start_index = i * each_num
end_idex = i * each_num + each_num
if i == (thread_num-1):
t = threading.Thread(target=writeTxt, args=(xml_all[start_index:end_idex], save_root, start_index, out_ret))
else:
t = threading.Thread(target=writeTxt, args=(xml_all[start_index:], save_root, start_index, out_ret))
thread_list.append(t)
t.start()
for child_thread in thread_list:
child_thread.join()
print(out_ret)
np_array = np.concatenate(out_ret, 0)
if __name__ == '__main__':
start_time = time.time()
run()
end_time = time.time()
print(f'thread time:{end_time - start_time}')
下图是不开线程和开线程结果对比,开线程会快到2倍
不开线程
开线程
参考: