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)
함수는 목록을 전달한 다음 이 목록에 대해 연산을 수행하고 연산 결과를 저장해야 합니다
따라서 처리해야 할 여러 파일을 최대한 동일한 크기의 목록으로 나눈 다음 스레드를 열어 각 목록을 처리하면 됩니다. 위의 주요 기능은
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()
주로 다음과 같은 두 줄의 코드로 구성됩니다. line 스레드 풀을 여는 데 사용되는
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 Tutorial위 내용은 Python에서 자주 파일 쓰기 속도를 높이는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

파이썬에서 문자열을 통해 객체를 동적으로 생성하고 메소드를 호출하는 방법은 무엇입니까? 특히 구성 또는 실행 해야하는 경우 일반적인 프로그래밍 요구 사항입니다.

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

이 기사는 Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask 및 요청과 같은 인기있는 Python 라이브러리에 대해 설명하고 과학 컴퓨팅, 데이터 분석, 시각화, 기계 학습, 웹 개발 및 H에서의 사용에 대해 자세히 설명합니다.

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...
