python写入文件较快,python频繁写入文件时提速的方法
问题背景:有一批需要处理的文件,对于每一个文件,都需要调用同一个函数进行处理,相当耗时。
有没有加速的办法呢?当然有啦,比如说你将这些文件分成若干批,每一个批次都调用自己写的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频繁写入文件时提速的方法相关推荐
- python怎么学最快-python怎么快速自学?
Python是最适合零基础学习的语言,应用范围广,难度较小也更好理解. 在此,小U整理了一下Python的学习路线,希望能对你有所帮助.小U咨询:2019年Python学习路线:零基础学人工智能.爬虫 ...
- python cmp函数未定义_python用plt画图时,cmp设置方法
在python,有时候是需要画图的,比如把一个矩阵用图像的形式显示,之前用的好好的,每次用plt.imshow(),都是彩色图,不知为啥,突然全是黑白图了,于是需要设置cmap的值,如下: plt.i ...
- python编程培训费用-python编程语言学费多少钱?python培训费用贵吗
现在的Python跟java火热的程度已经不相上下了,越来越多的人选择学习Python,由于市场的需求量增大,需要Python编程语言的的人才也随之增大,去培训机构咨询的人更是有增无减,那么,如此火热 ...
- python编程培训多少钱-python编程语言学费多少钱?python培训费用贵吗
现在的Python跟java火热的程度已经不相上下了,越来越多的人选择学习Python,由于市场的需求量增大,需要Python编程语言的的人才也随之增大,去培训机构咨询的人更是有增无减,那么,如此火热 ...
- python逐行写入csv_python之模块csv之CSV文件的写入(按行写入)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #CSV文件的写入(按行写入) import csv #csv文件,是一种常用的文本格式,用以存储表格数据,很 ...
- Python 获取接口数据,解析JSON,写入文件
Python 获取接口数据,解析JSON,写入文件 用于练手的例子,从国家气象局接口上获取JSON数据,将它写入文件中,并解析JSON: 总的来说,在代码量上,python代码量要比java少很多.而 ...
- python怎么把数据写入txt-如何将python中文件写入TXT
这篇文章主要介绍了如何将python中文件写入TXT,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.自己写入txt 直接上核心代码:with open("d ...
- python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入
Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...
- 【python图像处理】txt文件数据的读取与写入
在使用python进行数据和图像处理的过程中,经常会遇到从txt文件中读取数据.已经将处理过程中的矩阵数据写入到txt文件的情形,如在伪彩映射中读取颜色映射表. 下面介绍几种我平时常用的txt文件数据 ...
最新文章
- 阻塞非阻塞和同步异步
- 用力和应变片计算弹性模量_实验力学实验讲义(08.9).doc
- Python 第三方库之 docxtpl (处理word文档)
- Android数据库框架-----ORMLite 的基本用法
- 理想更新“货车并线预警”遭用户吐槽 李想:仍在优化
- spring的前后台数据传输。
- 图系列(一)图神经网络
- ThinkPHP去除url中的index.php
- 数据库系统概论第五版(笔记)
- Lighthouse
- 独家中文汉化AE脚本 Animation Studio v2.3 Win/Mac一键安装版 预设持续更新 支持CC2020
- 根据书单来制作item2vec
- 【报错笔记】Vector for token xxx has 147 dimensions, but previously read vectors have 300 dimensions.
- java极光短信的集成
- python判断字符串合法,详解Python判定IP地址合法性的三种方法 python中判断一个字符串是否是IP地址...
- 【量化】通过Fama-French三因子模型选股,收益能达到多少?
- 情绪:感觉、思考和沟通(无助益情绪通常由哪些非理性思考带来的、以及怎么减少这种无助益情绪...
- php ffmpeg 转码mp4,PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
- 利用$ajax实现远程登录判断
- Java的Io模型你了解多少?linuxmysql安装位置
热门文章
- dedecms v5.7 整合discuz x3.2 双向同步登录退出
- Android shape画单边线
- 【MyBatis教程】mybatis框架超全面详解总结
- 神奇的PHP “命真硬”,变老了,也更离不开了!
- 文心一言云服务即将上线;紫光原董事长赵伟国被审查;任正非:未来AI大模型赛道不只是微软一家;李开复筹办新AI公司丨每日大事件...
- Linux | 编译器gcc/g++的使用【动静态库的认识】
- DM数据库事务、锁、多版本机制
- mysqldump参数之-d -t -T
- 命令进入mysql创建jira_JIRA使用教程:连接数据库―MySQL
- Avalonia的资源和样式