最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python頻繁寫入文件時(shí)提速的方法

 更新時(shí)間:2019年06月26日 15:04:16   作者:尚  
在本篇內(nèi)容里小編給大家整理了關(guān)于python頻繁寫入文件時(shí)提速的方法以及相關(guān)代碼,需要的朋友們學(xué)習(xí)下。

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

有沒有加速的辦法呢?當(dāng)然有啦,比如說你將這些文件分成若干批,每一個批次都調(diào)用自己寫的python腳本進(jìn)行處理,這樣同時(shí)運(yùn)行若干個python程序也可以進(jìn)行加速。

有沒有更簡單的方法呢?比如說,我一個運(yùn)行的一個程序里面,同時(shí)分為多個線程,然后進(jìn)行處理?

大概思路:將這些個文件路徑的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) # 計(jì)算出畸變校正之后的對角線的理論長度

    scale = r_u_max/128 # 將這個長度壓縮到256的尺寸,會有一個scale,實(shí)際上這里寫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 # 實(shí)際上得到的r,即沒有resize到256×256的圖像尺寸size,并且?guī)牍街?

        r_d = (1.0 - math.sqrt(1 - 4.0 * k * r ** 2)) / (2 * k * r + eps) # 對應(yīng)在原圖(畸變圖)中的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: # 只有求的的畸變點(diǎn)在原圖中的時(shí)候才進(jìn)行賦值

          value1 = (i_d - 128.0)/128.0

          value2 = (j_d - 128.0)/128.0

          pixel_flow[j_u, i_u, 0] = value1 # mesh中存儲的是對應(yīng)的r的比值,在進(jìn)行畸變校正的時(shí)候,給定一張這樣的圖,進(jìn)行找像素即可

          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進(jìn)程

  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進(jìn)行操作,之后對操作的結(jié)果進(jìn)行保存

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

上面的主函數(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ù)進(jìn)行處理

  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ù)進(jìn)行處理

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

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

擴(kuò)展:

Python文件處理之文件寫入方式與寫緩存來提高速度和效率

Python的open的寫入方式有:

write(str):將str寫入文件

writelines(sequence of strings):寫多行到文件,參數(shù)為可迭代對象

f = open('blogCblog.txt', 'w') #首先先創(chuàng)建一個文件對象,打開方式為w
f.writelines('123456') #用readlines()方法寫入文件

運(yùn)行上面結(jié)果之后,可以看到blogCblog.txt文件有123456內(nèi)容,這里需要注意的是,mode為‘w'模式(寫模式),再來看下面代碼:

f = open('blogCblog.txt', 'w') #首先先創(chuàng)建一個文件對象,打開方式為w
f.writelines(123456) #用readlines()方法寫入文件

運(yùn)行上面代碼之后會報(bào)一個TypeError,這是因?yàn)閣ritelines傳入的參數(shù)并不是一個可迭代的對象。

以上就是關(guān)于python頻繁寫入文件怎么提速的相關(guān)知識點(diǎn)以及擴(kuò)展內(nèi)容,感謝大家的閱讀。

相關(guān)文章

  • python 函數(shù)內(nèi)部修改外部變量的方法

    python 函數(shù)內(nèi)部修改外部變量的方法

    今天小編就為大家分享一篇python 函數(shù)內(nèi)部修改外部變量的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python獲取DLL和EXE文件版本號的方法

    Python獲取DLL和EXE文件版本號的方法

    這篇文章主要介紹了Python獲取DLL和EXE文件版本號的方法,實(shí)例分析了Python獲取系統(tǒng)文件信息的技巧,需要的朋友可以參考下
    2015-03-03
  • Python學(xué)習(xí)入門之區(qū)塊鏈詳解

    Python學(xué)習(xí)入門之區(qū)塊鏈詳解

    區(qū)塊鏈的基礎(chǔ)概念很簡單:一個分布式數(shù)據(jù)庫,存儲一個不斷加長的 list,list 中包含著許多有序的記錄。下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)入門之區(qū)塊鏈的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。
    2017-07-07
  • 利用arcgis的python讀取要素的X,Y方法

    利用arcgis的python讀取要素的X,Y方法

    今天小編就為大家分享一篇利用arcgis的python讀取要素的X,Y方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 關(guān)于python中time和datetime的區(qū)別與用法

    關(guān)于python中time和datetime的區(qū)別與用法

    這篇文章主要介紹了關(guān)于python中time和datetime的區(qū)別與用法,Python中封裝了很多實(shí)用的函數(shù),那么關(guān)于時(shí)間的函數(shù)time和datetime有什么區(qū)別和作用,讓我們來看看吧
    2023-03-03
  • Keras load_model 導(dǎo)入錯誤的解決方式

    Keras load_model 導(dǎo)入錯誤的解決方式

    這篇文章主要介紹了Keras load_model 導(dǎo)入錯誤的解決方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 使用python制作九九乘法表的四種方法小結(jié)

    使用python制作九九乘法表的四種方法小結(jié)

    九九乘法表是初學(xué)者學(xué)習(xí)編程的必要練手題目之一,因此各種語言都有對應(yīng)的實(shí)現(xiàn)方式,而 Python 也不例外,在 Python 中,我們可以使用多種方式來生成一個簡單的九九乘法表,本文給大家總結(jié)了使用python制作九九乘法表的四種方法,需要的朋友可以參考下
    2024-03-03
  • Python+OpenCV實(shí)現(xiàn)表面缺陷檢測

    Python+OpenCV實(shí)現(xiàn)表面缺陷檢測

    對于現(xiàn)在很多工業(yè)檢測,特別是對一些精密的器件進(jìn)行篩選,往往都是像素級別的,十分的精確。本文將利用OpenCV+Python實(shí)現(xiàn)表面缺陷檢測,感興趣的可以了解一下
    2022-08-08
  • Pandas中DataFrame.drop()函數(shù)的具體使用

    Pandas中DataFrame.drop()函數(shù)的具體使用

    DataFrame.drop是Pandas庫中一個非常實(shí)用的函數(shù),用于刪除 DataFrame中的行或列,本文就來介紹一下Pandas中DataFrame.drop()函數(shù)的具體使用,感興趣的可以了解一下
    2024-07-07
  • Python實(shí)現(xiàn)八大排序算法

    Python實(shí)現(xiàn)八大排序算法

    這篇文章主要介紹了Python實(shí)現(xiàn)八大排序算法,如何用Python實(shí)現(xiàn)八大排序算法,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論

万盛区| 临沂市| 伊川县| 边坝县| 馆陶县| 延边| 宣恩县| 沐川县| 湘乡市| 崇明县| 岢岚县| 报价| 新河县| 东乡族自治县| 盐边县| 东莞市| 新建县| 花莲市| 衡东县| 满洲里市| 五家渠市| 丹棱县| 芜湖市| 深泽县| 西充县| 红桥区| 泸水县| 吉林省| 郁南县| 石河子市| 璧山县| 崇礼县| 舞阳县| 道孚县| 博爱县| 丹寨县| 文化| 德保县| 双柏县| 永宁县| 沁源县|