欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python頻繁寫入文件如何提速

python頻繁寫入文件如何提速?這個問題可能是我們?nèi)粘W習或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

創(chuàng)新互聯(lián)專注于老邊企業(yè)網(wǎng)站建設(shè),成都響應式網(wǎng)站建設(shè)公司,成都做商城網(wǎng)站。老邊網(wǎng)站建設(shè)公司,為老邊等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

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

有沒有加速的辦法呢?當然有啦,比如說你將這些文件分成若干批,每一個批次都調(diào)用自己寫的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,并且?guī)牍街?
                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')  # 將數(shù)據(jù)的格式轉(zhuǎn)換成float16類型, 節(jié)省空間
        # 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()

在上面的代碼中,函數(shù)

generate_flow_field(image_list)

需要傳入一個list,然后對于這個list進行操作,之后對操作的結(jié)果進行保存

所以,只需要將你需要處理的多個文件,切分成盡量等大小的list,然后再對每一個list,開一個線程進行處理即可

上面的主函數(shù):

if __name__ == '__main__':
    file_list = glob(file_path + '/*.JPEG')  # 將文件夾下所有的JPEG文件列成一個list
    m = 32  # 假設(shè)CPU有32個核心
    n = int(math.ceil(len(file_list) / float(m)))  # 每一個核心需要處理的list的數(shù)目
    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都用上面我們定義的函數(shù)進行處理
    pool.close()  # 處理結(jié)束之后,關(guān)閉線程池
    pool.join()

主要是這樣的兩行代碼,一行是

pool = multiprocessing.Pool(processes=m)  # 開32線程的線程池

用來開辟線程池

另外一行是

result.append(pool.apply_async(generate_flow_field, (file_list[i: i+n],)))  # 對每一個list都用上面我們定義的函數(shù)進行處理

對于線程池,用apply_async()同時跑generate_flow_field這個函數(shù),傳入的參數(shù)是:file_list[i: i+n]

實際上apply_async()這個函數(shù)的作用是所有的線程同時跑,速度是比較快的。

感謝各位的閱讀!看完上述內(nèi)容,你們對python頻繁寫入文件如何提速大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:python頻繁寫入文件如何提速
URL網(wǎng)址:http://chinadenli.net/article10/pgjggo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計網(wǎng)站建設(shè)電子商務(wù)建站公司用戶體驗服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)