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编程中对super函数的正确理解和用法解析
Jul 02 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
django js实现部分页面刷新的示例代码
May 28 Python
pycharm安装和首次使用教程
Aug 27 Python
python random从集合中随机选择元素的方法
Jan 23 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
Python使用永中文档转换服务
May 06 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
$(&quot;&quot;).click与onclick的区别示例介绍
2014/09/25 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
javascript实现画板功能
2020/04/12 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
django创建超级用户过程解析
2019/09/18 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
管理学专业个人求职信范文
2013/12/13 职场文书
事务机电主管工作职责
2014/02/25 职场文书
基层党员公开承诺书
2014/05/29 职场文书
健康状况证明书
2014/11/26 职场文书
python源码剖析之PyObject详解
2021/05/18 Python