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

有没有加速的办法呢?当然有啦,比如说你将这些文件分成若干批,每一个批次都调用自己写的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中调用多进程加速处理文件相关推荐

  1. 从Python中的另一个文件调用函数

    本文翻译自:Call a function from another file in Python Set_up: I have a .py file for each function I need ...

  2. python中调用c库

    python中调用c库 2013-04-23 15:34:52|  分类: python核心编程 |  标签:python  makefile   |举报 |字号 订阅 参考地址:http://my. ...

  3. python r语言 结合 部署_(转)python中调用R语言通过rpy2 进行交互安装配置详解...

    python中调用R语言通过rpy2 进行详解 1.R语言的安装: 大家进行R语言的安装,在安装好R后,需要配置环境变量R才能进行使用. 对此电脑右键->选择高级设置->环境变量-> ...

  4. python中调用C++函数

    python中调用C++函数 无参调用 单变量传入与返回调用 numpy数组传入与返回调用 c++类调用 用python写不香吗?还这么复杂调用C++? 一. 无参调用 在python中调用无参数和无 ...

  5. python调用simulink_[Python-MATLAB] 在Python中调用MATLAB的API

    可以参考官方的说明文档: MATLAB Engine API的使用文档: 原材料: 1.MATLAB 2015a  32位的 2.Python 2.7.13    32位的 安装: 1.运行cmd,切 ...

  6. [转载] 扩展Python之在Python中调用C编写的函数模块

    参考链接: 如何在Python中调用C函数 目录 编写Python扩展1. 创建应用代码2. 根据样板编写封装代码2.1 包含Python头文件2.2 为每一个模块函数添加形如PyObject* *M ...

  7. linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用

    目录 Table of Contents 目录 一 源码编译和安装 添加opencv路径 二 增加并列子函数的方法 三 增加库函数形参的方法 四 cv增加子函数一些数据变量的问题 4.1 数据类型 一 ...

  8. python中如何打开csv文件_Python对CSV文件的处理

    原标题:Python对CSV文件的处理 在接口自动化测试中,把测试的数据存储到csv的文件也是一种很不错的选择,下面就详细的介绍如何实现CSV文件内容的读取和如何把数据写入到CSV的文件中.在Pyth ...

  9. python中调用adb命令来控制手机

    前言 如今python是非常多人学习的,而手机也几乎人手一部.对于很多Python学习者,想用python来完成android手机中各种炫酷的的控制,adb是必不可缺少的工具之一.比如17年末大热的微 ...

最新文章

  1. mesos+marathon平台搭建
  2. rust高级矿场_高级 Rust 所有权管理
  3. 2015年山石网科面试题
  4. Sublime Text 3(中文)在Windows下的配置、安装、运行
  5. C语言之rand()和srand()函数
  6. java zip解压_Java语言入门第一课
  7. Django model 字段类型及选项解析(一)
  8. jquery中方法扩展 ($.fn $.extend) 学习笔记
  9. js防止表单的重复提交
  10. 概率论笔记3.1二维随机变量及其函数分布
  11. bat使用命令解析-详细(转)
  12. 基于微信小程序的校园信息共享平台 毕业设计-附源码211615
  13. win10怎么放计算机在桌面,win10怎么把此电脑放到桌面_w10如何把此电脑添加到桌面...
  14. 推荐一款技术人必备的接口测试神器:Apifox
  15. Myeclipse 是如何启动tomcat服务
  16. 会议室可以使用全彩LED显示屏吗?
  17. 北航2021届计组 - 支持中断的CPU
  18. 从市值14亿美元到1000美元,人人车经历了什么?
  19. 托里拆利小号:有关于其的证明
  20. 《富爸爸,穷爸爸》读后感——怎么实现财务自由

热门文章

  1. [C# 基础知识梳理系列]专题二:委托的本质论
  2. jvm - 垃圾回收 gc
  3. JSONP跨域请求数据报错 “Unexpected token :”的解决办法
  4. djangoORM数据类型及基本操作
  5. Chrome插件会干坏事儿的
  6. Ubuntu下VIM使用指南
  7. 关于异常Exception
  8. mysql定时执行存储过程
  9. HDU-2079 选课时间(题目已修改,注意读题) -母函数
  10. hdu-1565(方格取数(1))---状态压缩