欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python頻繁寫入文件時提速的方法

系統 2155 0

問題背景:有一批需要處理的文件,對于每一個文件,都需要調用同一個函數進行處理,相當耗時。

有沒有加速的辦法呢?當然有啦,比如說你將這些文件分成若干批,每一個批次都調用自己寫的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頻繁寫入文件怎么提速的相關知識點以及擴展內容,感謝大家的閱讀。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费观看一级欧美在线视频 | 国产精品综合网 | 99re在线| 国产精品成人一区二区1 | 无码免费一区二区三区免费播放 | 九九色网站 | 中国一级特黄真人毛片 | 被摁着灌浓精囚禁高h1v1 | 日日干天天 | 丝袜美腿一区二区三区动态图 | www黄色免费 | 丁香花成人另类小说 | 波多野结衣xfplay在线观看 | 精品乱子伦一区二区三区 | 波多野吉衣一区二区 | 久久影院在线观看 | 一区二区精品在线 | 一区二区三区四区国产精品视频 | 久久婷婷是五月综合色狠狠 | 在线无码 | 天天色天天看 | 亚洲欧美日韩综合一区久久 | 日本一本免费一二区 | 不卡视频一区二区 | 日本视频网站在线观看 | 国产97免费视频 | 一本色道久久88综合亚洲精品高清 | 精品国产不卡一区二区三区 | 午夜不卡电影 | 精品久久久久久久人人人人传媒 | 成人性生免费视频 | 国产精品久久久久久免费 | 天天色综合久久 | 91视频国内| 日韩激情视频在线 | www.天天操.com | 中文字幕日韩在线 | 久久精品亚洲 | 亚洲 中文 欧美 日韩 在线观看 | 日本韩国一区二区三区 | 天天操很很操 |