Python での頻繁なファイルの書き込みを高速化する方法
問題の背景: 処理する必要のあるファイルのバッチがあり、ファイルごとに同じ関数を呼び出して処理する必要があり、非常に時間がかかります。
高速化する方法はありますか?もちろんそれはありますが、例えばこれらのファイルを複数のバッチに分割すると、各バッチで作成した Python スクリプトを呼び出して処理するため、複数の Python プログラムを同時に実行する場合も高速化できます。
もっと簡単な方法はありますか?たとえば、実行するプログラムは同時に複数のスレッドに分割されて処理されますか?
一般的な考え方: ファイル パスのリストをいくつかの部分に分割します。分割する部分の数については、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 を選択し、このリストを操作して操作の結果を保存します。
したがって、処理する必要がある複数のファイルをできるだけ同じサイズのリストに分割してから開くだけで済みます。各リストのスレッドです。処理するだけです。
上記のメイン関数:
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()
これは主に 2 行のコードで、1 行は
pool = multiprocessing.Pool(processes=m) # 开32线程的线程池
を開くために使用されます。スレッド プール
さらに 1 行は
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 チュートリアル 列にアクセスして学習してください。
以上がPython での頻繁なファイルの書き込みを高速化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。
