问题背景是这样的,我有一批需要处理的文件,对于每一个文件,都需要调用同一个函数进行处理,相当耗时

有没有加速的办法呢?当然有啦,比如说你将这些文件分成若干批,每一个批次都调用自己写的python脚本进行处理,这样同时运行若干个python程序也可以进行加速

但是,有没有更简单的方法呢?比如说,我一个运行的一个程序里面,同时分为多个线程,然后进行处理?

实际上是有的

大概思路是这样,将这些个文件路径的list,分成若干个,至于分成多少,要看自己cpu核心有多少,比如你的cpu有32核的,理论上就可以加速32倍

直接上代码:

# -*-coding:utf-8-*-
import numpy as np
from glob import glob
import math
import os
import torch
from tqdm import tqdm
import multiprocessing label_path = '/home/ying/data/shiyongjie/distortion_datasets/new_distortion_dataset/train/label.txt'
file_path = '/home/ying/data/shiyongjie/distortion_datasets/new_distortion_dataset/train/distortion_image'
save_path = '/home/ying/data/shiyongjie/distortion_datasets/new_distortion_dataset/train/flow_field' r_d_max = 128
image_index = 0
txt_file = open(label_path)
file_list = txt_file.readlines()
txt_file.close()
file_label = {}
for i in file_list:
i = i.split()
file_label[i[0]] = i[1] r_d_max = 128
eps = 1e-32
H = 256
W = 256 def generate_flow_field(image_list):
for image_file_path in ((image_list)):
pixel_flow = np.zeros(shape=tuple([256, 256, 2])) # 按照pytorch中的grid来写
image_file_name = os.path.basename(image_file_path)
# print(image_file_name)
k = float(file_label[image_file_name])*(-1)*1e-7
# print(k)
r_u_max = r_d_max/(1+k*r_d_max**2) # 计算出畸变校正之后的对角线的理论长度
scale = r_u_max/128 # 将这个长度压缩到256的尺寸,会有一个scale,实际上这里写128*sqrt(2)可能会更加直观
for i_u in range(256):
for j_u in range(256):
x_u = float(i_u - 128)
y_u = float(128 - j_u)
theta = math.atan2(y_u, x_u)
r = math.sqrt(x_u ** 2 + y_u ** 2)
r = r * scale # 实际上得到的r,即没有resize到256×256的图像尺寸size,并且带入公式中
r_d = (1.0 - math.sqrt(1 - 4.0 * k * r ** 2)) / (2 * k * r + eps) # 对应在原图(畸变图)中的r
x_d = int(round(r_d * math.cos(theta)))
y_d = int(round(r_d * math.sin(theta)))
i_d = int(x_d + W / 2.0)
j_d = int(H / 2.0 - y_d)
if i_d < W and i_d >= 0 and j_d < H and j_d >= 0: # 只有求的的畸变点在原图中的时候才进行赋值
value1 = (i_d - 128.0)/128.0
value2 = (j_d - 128.0)/128.0
pixel_flow[j_u, i_u, 0] = value1 # mesh中存储的是对应的r的比值,在进行畸变校正的时候,给定一张这样的图,进行找像素即可
pixel_flow[j_u, i_u, 1] = value2 # 保存成array格式
saved_image_file_path = os.path.join(save_path, image_file_name.split('.')[0] + '.npy')
pixel_flow = pixel_flow.astype('f2') # 将数据的格式转换成float16类型, 节省空间
# print(saved_image_file_path)
# print(pixel_flow)
np.save(saved_image_file_path, pixel_flow)
return if __name__ == '__main__':
file_list = glob(file_path + '/*.JPEG')
m = 32
n = int(math.ceil(len(file_list) / float(m))) # 向上取整
result = []
pool = multiprocessing.Pool(processes=m) # 32进程
for i in range(0, len(file_list), n):
result.append(pool.apply_async(generate_flow_field, (file_list[i: i+n],)))
pool.close()
pool.join()

在上面的代码中,我的函数

generate_flow_field(image_list)

需要传入一个list,然后对于这个list进行操作,之后对操作的结果进行保存

所以,只需要将你需要处理的多个文件,切分成尽量等大小的list,然后再对每一个list,开一个线程进行处理即可

看我上面的主函数

if __name__ == '__main__':
file_list = glob(file_path + '/*.JPEG') # 将文件夹下所有的JPEG文件列成一个list
m = 32 # 假设CPU有32个核心
n = int(math.ceil(len(file_list) / float(m))) # 每一个核心需要处理的list的数目
result = []
pool = multiprocessing.Pool(processes=m) # 开32线程的线程池
for i in range(0, len(file_list), n):
result.append(pool.apply_async(generate_flow_field, (file_list[i: i+n],))) # 对每一个list都用上面我们定义的函数进行处理
pool.close() # 处理结束之后,关闭线程池
pool.join()

主要是这样的两行代码,一行是

pool = multiprocessing.Pool(processes=m)  # 开32线程的线程池

用来开辟线程池

另外一行是

result.append(pool.apply_async(generate_flow_field, (file_list[i: i+n],)))  # 对每一个list都用上面我们定义的函数进行处理

对于线程池,用apply_async()同时跑generate_flow_field这个函数,传入的参数是:file_list[i: i+n]

实际上apply_async()这个函数的作用是所有的线程同时跑,速度是比较快的

怎么样,讲到这里,是不是学会如何使用pool.apply_async()来进行多线程加速了呢?

python中调用多线程加速处理文件的更多相关文章

  1. Python之FTP多线程下载文件之分块多线程文件合并

    Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...

  2. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

  3. Django之在Python中调用Django环境

    Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...

  4. (转)python中调用R语言通过rpy2 进行交互安装配置详解

    python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753   python中调用R语言通过r ...

  5. 如何在python中调用C语言代码

    1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/ ...

  6. Python中基本的读文件和简单数据处理

    Python中基本的读文件和简单数据处理 暂无评论 DataQuest上面的免费课程(本文是Python基础课程部分),里面有些很基础的东西(csv文件读,字符串预处理等),发在这里做记录.涉及下面六 ...

  7. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...

  8. [Python-MATLAB] 在Python中调用MATLAB的API

    可以参考官方的说明文档: http://cn.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for- ...

  9. python中的多线程和多进程

    一.简单理解一下线程和进程 一个进程中可有多个线程,线程之间可共享内存,进程间却是相互独立的.打比方就是,进程是火车,线程是火车厢,车厢内人员可以流动(数据共享) 二.python中的多线程和多进程 ...

随机推荐

  1. IDEA如何导入一个web+maven以及如何运行项目

    IDEA如何导入一个web+maven以及如何运行项目 然后就可以运行你的maven项目了....

  2. web服务器/应用服务器/http服务器/中间件

    web服务器:只处理html静态页面不处理动态页面,如apache/nginx/iis等. 应用服务器:能处理html静态页面也能处理动态页面,如tomcat/weblogic/websphere/j ...

  3. 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

    https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ...

  4. 使用C#开发数据库应用程序

    第一章 用Hello ACCP.NET快速热身(一) 1-1.进入C#世界 a.第一个C#程序 (1)新建项目[项目:project] (2)生成解决方案[生成:build,解决方案:solution ...

  5. 神奇的口袋(dp)

    有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2……an.John可 ...

  6. H5离线缓存技术Application Cache

    H5离线缓存技术Application Cache 1.离线缓存技术:是浏览器本身的一种机制 HTML5引入Application Cache(应用程序缓存)技术,离线存储可以将站点的一些文件存储在本 ...

  7. 1-3Controller之Response

    控制器中的方法: public function response1(){ /*响应的常见类型: * 1.字符串 * 2.视图 * 3.json * 4.重定向 * */ //响应JSON /*$da ...

  8. QuickStart系列:docker部署之MariaDB

    Centos7里面没有Mysql 取而代之的是MariaDB,MariaDB是完全开源的.MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的 ...

  9. 图的关键路径,AOE,完整实现,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  10. 【转载】linux Jumpserver跳板机堡垒机部署安装使用教程

    原文地址:https://idc.wanyunshuju.com/li/554.html