python频繁写入文件时提速的方法


Posted in Python onJune 26, 2019

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

有没有加速的办法呢?当然有啦,比如说你将这些文件分成若干批,每一个批次都调用自己写的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()这个函数的作用是所有的线程同时跑,速度是比较快的。

扩展:

Python文件处理之文件写入方式与写缓存来提高速度和效率

Python的open的写入方式有:

write(str):将str写入文件

writelines(sequence of strings):写多行到文件,参数为可迭代对象

f = open('blogCblog.txt', 'w') #首先先创建一个文件对象,打开方式为w
f.writelines('123456') #用readlines()方法写入文件

运行上面结果之后,可以看到blogCblog.txt文件有123456内容,这里需要注意的是,mode为‘w'模式(写模式),再来看下面代码:

f = open('blogCblog.txt', 'w') #首先先创建一个文件对象,打开方式为w
f.writelines(123456) #用readlines()方法写入文件

运行上面代码之后会报一个TypeError,这是因为writelines传入的参数并不是一个可迭代的对象。

以上就是关于python频繁写入文件怎么提速的相关知识点以及扩展内容,感谢大家的阅读。

Python 相关文章推荐
Python中的getopt函数使用详解
Jul 28 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
Mar 05 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
Dec 23 Python
Python内置函数locals和globals对比
Apr 28 Python
python实现文法左递归的消除方法
May 22 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 #Python
使用python的pandas为你的股票绘制趋势图
Jun 26 #Python
python安装scipy的方法步骤
Jun 26 #Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 #Python
如何通过python画loss曲线的方法
Jun 26 #Python
python and or用法详解
Jun 26 #Python
python覆盖写入,追加写入的实例
Jun 26 #Python
You might like
php下载文件超时时间的设置方法
2016/10/06 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
Django框架多表查询实例分析
2018/07/04 Python
基于python历史天气采集的分析
2019/02/14 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
最新创业融资计划书
2014/01/19 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
出国留学导师推荐信
2015/03/26 职场文书
六年级作文之关于梦
2019/10/22 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
如何基于python实现单目三维重建详解
2022/06/25 Python
Nginx报404错误的详细解决方法
2022/07/23 Servers