代码编织梦想

# -*- 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倍

不开线程

0f1b61c6bc5875678f7bec6397d01d69.jpeg

开线程

0505962c65c2c8d22d41ad86a55286bf.jpeg

参考:

https://www.liujiangblog.com/course/python/79

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shenjianhua005/article/details/129600688

python并发处理list数据_3种方式实现python多线程并发处理-爱代码爱编程

标签: python奇淫技巧 最优线程数 Ncpu=CPU的数量 Ucpu=目标CPU使用率 W/C=等待时间与计算时间的比率 为保持处理器达到期望的使用率,最优的线程池的大小等于 $$Nthreads=Ncpu*Ucpu*(1+W/C$$ cpu密集型任务,即$W< 如果希望CPU利用率为100%,则$Nthreads=Ncpu$ IO密集型任务,

python多线程处理循环方式_使用python循环的多线程处理-爱代码爱编程

我试图在处理器的几个线程上运行这个Python代码,但是我找不到如何分配多个线程。我在Jupyter(以前叫I python)中使用的是python 2.7。 初始代码如下(所有这部分都工作得很好)。它是一个web解析器,它接受x,即我的列表中的一个url,即一个url列表,然后编写一个CSV(其中out_string是一行)。 不带多线程的代码m

python多线程处理同一批数据-爱代码爱编程

# -*- coding: utf-8 -*- import math import random import time from concurrent.futures import ThreadPoolExecutor def split_list():     # 线程列表     new_list = []     count_list = [

python多线程处理循环方式_带循环的python多线程处理-爱代码爱编程

我尝试这一点主要是为了练习多处理,并学习如何使用argparse。在 这需要大约4-5千兆内存,以防你的机器没有太多内存。在python euler.py -l 50000000 -n 100 -p 8 Took 5.836833333969116 minutes The largest product of 100 consecutive nu

已解决!!python多线程处理数据(python3.8)-爱代码爱编程

造轮子造轮子了!近期在帮师兄做实验的时候我发现,在预处理大量数据的时候,他总是一条条跑,连我这种脑子都能同时用两只手打字,不行,我得给这程序上多线程…… 读者知: 1.代码背景是读入一个每一行都是一个句子的文件,然后调用stanza进行句法解析。 2.如果你想最快上手这段代码,那么你需要处理成一个存放每一条数据的list,将它赋值给stack,将pa

python多线程处理图像-爱代码爱编程

在做深度学习的时候,经常要处理各种数据,多线程可以加速处理图像 import os from PIL import Image import numpy as np import threadpool names = os.listdir("./STDC/before/") images = [img for img in names if img[

Python多线程同时处理多个文件-爱代码爱编程

前言 在需要对大量文件进行相同的操作时,逐个遍历是非常耗费时间的。这时,我们可以借助于Python的多线程操作来大大提高处理效率,减少处理时间。 问题背景 比如说,我们现在需要从一个文件夹下面读取出所有的视频,然后对每个视频进行逐帧处理。由于对视频逐帧处理本身就是比较耗时的任务,如果按照串行的方式顺序处理每个视频文件是效率非常低的,此时,一种比较容易

python多线程图片处理-爱代码爱编程

有时候我们需要对图片进行如加噪、放缩等变换,当数据集比较大时,遍历整个数据集所用时间太长,为此可以写一点多线程处理的代码,下面以压缩为例子:# author: Wu # 2022/1/24 # This script is used to jpeg compress import os import cv2 import numpy as np from

Python多线程处理-爱代码爱编程

什么是进程 进程是执行中的程序。拥有独立地址空间,内存,数据栈等。操作系统统一管理。派生(fork或spawn)新进程。进程间通信(IPC)方式共享信息。什么是线程 同进程下执行,并共享相同的上下文。线程间的信息共享和通信更加容易。多线程并发执行。需要同步原语。python与线程 解释器主循环主循环中只有一个控制线程在执行。使用全局解释器锁(GIL)

python多线程详解_python 多线程-爱代码爱编程

现代计算机CPU物理核心普遍比较多,我们在编写程序时经常会用到多线程技术来提高程序运行的效率。作为python萌新,我在掌握基本语法后就很想摆弄一下python的多线程,使用起来确实很有python的特点,代码量少、操

python3内置模块之json编码解码方法讲解_python json.loads的时候进行字符编码-爱代码爱编程

简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,在接口数据开发和传输中非常常用。 Python3中我们利用内置模块json解码和编码JSON