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中将字典形式的数据循环插入Excel
Jan 16 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
PyQt5中QSpinBox计数器的实现
Jan 18 Python
分享Python获取本机IP地址的几种方法
Mar 17 Python
Python集合set()使用的方法详解
Mar 18 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
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python模拟登录12306的方法
2014/12/30 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
Shell如何接收变量输入
2016/08/06 面试题
新闻发布会策划方案
2014/06/12 职场文书
求职教师自荐书
2014/06/19 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL