Как использовать ProcessPoolExecutor из concurrent.futures с функцией с несколькими аргументами? - PullRequest
0 голосов
/ 27 апреля 2019

Мне нужно ускорить несколько медленный процесс вычисления Python.Когда я использую свой обычный код, он использует только один из моих процессоров.Мне нужен этот процесс, чтобы использовать все мои процессоры.

Итак, я обнаружил, что использование ProcessPoolExecutor () из модуля concurrent.futures может сделать это для меня.

Вот пример, описывающий это (оригиналздесь: https://towardsdatascience.com/heres-how-you-can-get-a-2-6x-speed-up-on-your-data-pre-processing-with-python-847887e63be5):

Написана функция Python для изменения размера всех изображений в папке до размера 600x600.Итак, базовая функция:

import glob
import os
import cv2

for image_filename in glob.glob("*.jpg"):
    img = cv2.imread(image_filename)
    img = cv2.resize(img, (600, 600))

Используя ProcessPoolExecutor () и делая его в 6 раз быстрее с 6-ядерным процессором, код выглядит следующим образом:

import glob
import os
import cv2
import concurrent.futures

def load_and_resize(image_filename):
    img = cv2.imread(image_filename)
    img = cv2.resize(img, (600, 600))

with concurrent.futures.ProcessPoolExecutor() as executor:
    image_files = glob.glob("*.jpg")
    executor.map(load_and_resize, image_files)

ОК, кажетсядовольно прямо для меня.

Теперь, как применить вышеизложенное для моего случая?

Моя установка такова:

# basic function for performing the calculations
def slow_time_consuming_function(arg1, arg2, arg3, arg4):
    # do some slow calculations with arg1, arg2, arg3, arg4
    # return some float result

# list of arg1 values (usual length of 100-500) 
arg1_list = ['xx', 'xx1', 'xx2', ...]

# function for calculating the whole range of arg1 values
def multiple_arg1_values_calculation_function(arg1_list, arg2, arg3, arg4):
    # empty list for the results
    list_results = []

    # loop for calculating  the results
    for arg1 in arg1_list:
        list_results.append(slow_time_consuming_function(arg1, arg2, arg3, arg4))

    return list_results

Моя проблема в том, что я могуне кодируйте все аргументы, не являющиеся аргументами arg1, для основной функции (некоторые из них являются объектами Python, созданными пользователем, и т. д.)1024 *

...