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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
python在不同层级目录import模块的方法
Jan 31 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
PyQt5每天必学之进度条效果
Apr 19 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
详解python中eval函数的作用
Oct 22 Python
Python类class参数self原理解析
Nov 19 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
2010/02/09 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
php输出xml属性的方法
2015/03/19 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
简单了解Python中的几种函数
2017/11/03 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
python 实现简单的FTP程序
2019/12/27 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
一名女生的自荐信
2013/12/08 职场文书
军校本科大学生自我评价
2014/01/14 职场文书
就业自我评价
2014/02/04 职场文书
小学毕业演讲稿
2014/04/25 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
党校培训学习心得体会
2016/01/06 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL