python中调用多进程加速处理文件
问题背景是这样的,我有一批需要处理的文件,对于每一个文件,都需要调用同一个函数进行处理,相当耗时
有没有加速的办法呢?当然有啦,比如说你将这些文件分成若干批,每一个批次都调用自己写的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 multiprocessinglabel_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 = 256def 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) # 对应在原图(畸变图)中的rx_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.0value2 = (j_d - 128.0)/128.0pixel_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)returnif __name__ == '__main__':file_list = glob(file_path + '/*.JPEG')m = 32n = 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文件列成一个listm = 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中调用多进程加速处理文件相关推荐
- 从Python中的另一个文件调用函数
本文翻译自:Call a function from another file in Python Set_up: I have a .py file for each function I need ...
- python中调用c库
python中调用c库 2013-04-23 15:34:52| 分类: python核心编程 | 标签:python makefile |举报 |字号 订阅 参考地址:http://my. ...
- python r语言 结合 部署_(转)python中调用R语言通过rpy2 进行交互安装配置详解...
python中调用R语言通过rpy2 进行详解 1.R语言的安装: 大家进行R语言的安装,在安装好R后,需要配置环境变量R才能进行使用. 对此电脑右键->选择高级设置->环境变量-> ...
- python中调用C++函数
python中调用C++函数 无参调用 单变量传入与返回调用 numpy数组传入与返回调用 c++类调用 用python写不香吗?还这么复杂调用C++? 一. 无参调用 在python中调用无参数和无 ...
- python调用simulink_[Python-MATLAB] 在Python中调用MATLAB的API
可以参考官方的说明文档: MATLAB Engine API的使用文档: 原材料: 1.MATLAB 2015a 32位的 2.Python 2.7.13 32位的 安装: 1.运行cmd,切 ...
- [转载] 扩展Python之在Python中调用C编写的函数模块
参考链接: 如何在Python中调用C函数 目录 编写Python扩展1. 创建应用代码2. 根据样板编写封装代码2.1 包含Python头文件2.2 为每一个模块函数添加形如PyObject* *M ...
- linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用
目录 Table of Contents 目录 一 源码编译和安装 添加opencv路径 二 增加并列子函数的方法 三 增加库函数形参的方法 四 cv增加子函数一些数据变量的问题 4.1 数据类型 一 ...
- python中如何打开csv文件_Python对CSV文件的处理
原标题:Python对CSV文件的处理 在接口自动化测试中,把测试的数据存储到csv的文件也是一种很不错的选择,下面就详细的介绍如何实现CSV文件内容的读取和如何把数据写入到CSV的文件中.在Pyth ...
- python中调用adb命令来控制手机
前言 如今python是非常多人学习的,而手机也几乎人手一部.对于很多Python学习者,想用python来完成android手机中各种炫酷的的控制,adb是必不可缺少的工具之一.比如17年末大热的微 ...
最新文章
- mesos+marathon平台搭建
- rust高级矿场_高级 Rust 所有权管理
- 2015年山石网科面试题
- Sublime Text 3(中文)在Windows下的配置、安装、运行
- C语言之rand()和srand()函数
- java zip解压_Java语言入门第一课
- Django model 字段类型及选项解析(一)
- jquery中方法扩展 ($.fn $.extend) 学习笔记
- js防止表单的重复提交
- 概率论笔记3.1二维随机变量及其函数分布
- bat使用命令解析-详细(转)
- 基于微信小程序的校园信息共享平台 毕业设计-附源码211615
- win10怎么放计算机在桌面,win10怎么把此电脑放到桌面_w10如何把此电脑添加到桌面...
- 推荐一款技术人必备的接口测试神器:Apifox
- Myeclipse 是如何启动tomcat服务
- 会议室可以使用全彩LED显示屏吗?
- 北航2021届计组 - 支持中断的CPU
- 从市值14亿美元到1000美元,人人车经历了什么?
- 托里拆利小号:有关于其的证明
- 《富爸爸,穷爸爸》读后感——怎么实现财务自由