python频繁写入文件如何提速

  

python频繁写入文件如何提速?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

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

有没有加速的办法呢?当然有啦,比如说你将这些文件分成若干批,每一个批次都调用自己写的python脚本进行处理,这样同时运行若干个python程序也可以进行加速。

有没有更简单的方法呢?比如说,我一个运行的一个程序里面,同时分为多个线程,然后进行处理?

大概思路:将这些个文件路径的列表,分成若干个,至于分成多少,要看自己的cpu核心有多少,比如你的cpu有32核的,理论上就可以加速32倍。

代码如下:

# - *编码:utf - 8 - *   进口numpy np   从进口一滴水珠   导入数学   进口操作系统   进口火炬   从tqdm进口tqdm   进口多处理   label_path=& # 39;/home/英/数据/shiyongjie/distortion_datasets new_distortion_dataset/火车/label.txt& # 39;   file_path=& # 39;/home/英/数据/shiyongjie/distortion_datasets new_distortion_dataset/火车/distortion_image& # 39;   save_path=& # 39;/home/英/数据/shiyongjie/distortion_datasets new_distortion_dataset/火车/flow_field& # 39;   r_d_max=128   image_index=0   txt_file=开放(label_path)   file_list=txt_file.readlines ()   txt_file.close ()   file_label={}   因为我在file_list:   我=i.split ()   file_label我[我[0]]=[1]   r_d_max=128   每股收益=1 e-32   H=256   W=256   def generate_flow_field (image_list):   对于image_file_path ((image_list)):   pixel_flow=np。0(形状=元组([256、256、2]))#按照pytorch中的网格来写   image_file_name=os.path.basename (image_file_path)   #打印(image_file_name)   k=浮动(file_label [image_file_name]) * (1) * 1 e   #打印(k)   r_u_max=r_d_max/(1 + k * r_d_max * * 2) #计算出畸变校正之后的对角线的理论长度   规模=r_u_max/128 #将这个长度压缩到256的尺寸,会有一个规模,实际上这里写128 * 12(2)可能会更加直观   i_u的范围(256):   j_u的范围(256):   x_u=浮动(i_u - 128)   y_u=(128 - j_u)浮动   θ=数学。量化(y_u x_u)   r=数学。√x_u * * 2 + y_u * * 2)   r=r *规模#实际上得到的r,即没有调整到256×256的图像尺寸大小,并且带入公式中   r_d=(1.0 -数学。√1 - 4.0 * k * r * * 2))/(2 * k * r + eps) #对应在原图(畸变图)中的r   x_d=int(圆(r_d * math.cos(θ)))   y_d=int(圆(r_d * sin(θ)))   i_d=int (x_d + W/2.0)   j_d=int (H/2.0 - y_d)   如果i_d & lt;W和i_d祝辞=0和j_d & lt;H和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 #网中存储的是对应的r的比值,在进行畸变校正的时候,给定一张这样的图,进行找像素即可   pixel_flow j_u i_u 1=value2   #保存成数组格式   saved_image_file_path=os.path。加入(save_path image_file_name.split(& # 39;强生# 39;)[0]+ & # 39;.npy& # 39;)   pixel_flow=pixel_flow.astype (& # 39; f2 # 39;) #将数据的格式转换成float16类型,节省空间   #打印(saved_image_file_path)   #打印(pixel_flow)   np。保存(saved_image_file_path pixel_flow)   返回   if __name__==& # 39; __main__ # 39;:   file_list=水珠(file_path + & # 39;/* . jpeg # 39;)   m=32   n=int (math.ceil (len (file_list)/浮动(m))) #向上取整   结果=[]   池=multiprocessing.Pool(过程=m) # 32进程   因为我在范围(0,len (file_list), n):   result.append(池。apply_async (generate_flow_field, (file_list(我+ n))))   pool.close ()   pool.join ()

在上面的代码中,函数

generate_flow_field (image_list)

需要传入一个列表,然后对于这个列表进行操作,之后对操作的结果进行保存

所以,只需要将你需要处理的多个文件,切分成尽量等大小的列表,然后再对每一个列表,开一个线程进行处理即可

上面的主函数:

if __name__==& # 39; __main__ # 39;:   file_list=水珠(file_path + & # 39;/* . JPEG # 39;) #将文件夹下所有的JPEG文件列成一个清单   m=32 #假设CPU有32个核心   n=int (math.ceil (len (file_list)/浮动(m))) #每一个核心需要处理的列表的数目   结果=[]   池=multiprocessing.Pool(过程=m) #开32线程的线程池   因为我在范围(0,len (file_list), n):   result.append(池。apply_async (generate_flow_field, (file_list(我+ n)))) #对每一个列表都用上面我们定义的函数进行处理   pool.close() #处理结束之后,关闭线程池   pool.join ()

python频繁写入文件如何提速