#python #multiprocessing
#python #многопроцессорность
Вопрос:
У меня есть функция, которая загружает процессор на 128 мс, я попытался ее распараллелить, но эффект тот же, никакого ускорения вообще. Я не уверен, что я там делаю не так.
Эта функция является вычислительно дорогой:
def compute(id, x,y,frame_id,df_region, region_buffered, df_line):
gb = ('trajectory_id',)
global general_pd
general_pd.loc[len(general_pd)] = [id, x,y, frame_id]
grouped = general_pd.loc[general_pd['trajectory_id'] == id]
rpp = RawParameterProcessor(grouped, df_line, frame_idx, df_region, region_buffered, gb=gb, v_thresh=5 / 3.6)
df_parameter_car = rpp.compute()
return df_parameter_car
и я использую его в обнаружении объектов tensorflow, где я выполняю вычисления для обнаруженных объектов:
Обратите внимание, что следующий фрагмент кода выполняется в основном цикле, где я получаю эти данные из видеозаписи cv2.
ДЛЯ КАЖДОГО КАДРА ИЗ ВИДЕОЗАХВАТА
for trk in car_detections:
trk = trk.astype(np.int32)
p = np.array([[((trk[1] trk[3]) / 2, (trk[0] trk[2]) / 2)]], dtype=np.float32)
center_pt = cv2.perspectiveTransform(p, H)
ptx = center_pt.T.item(0)
pty = center_pt.T.item(1)
df_cars = pool.apply_async(compute, (trk[4], ptx, pty, frame_idx, df_region, region_buffered, df_line,))
results.append(df_cars)
for result in results:
genera_data_pd_cars = genera_data_pd_cars.append(result.get())
Комментарии:
1. Примеры говорят, что
# launching multiple evaluations asynchronously *may* use more processes
2. @wwii значит, решения нет?
3. Возможно, вы захотите использовать
concurrent.futures
сProcessPoolExecutor
.concurrent.futures
довольно приятный, он обрабатывает всю закулисную деятельность по распределению аргументов между функциями в нескольких процессах и извлечению результатов. Примеры довольно легко адаптировать.4. Мне нравится использовать формат примера, приведенного для
ThreadPoolExecutor
: отправка нескольких задач в цикле и сбор фьючерсов, затем повторение фьючерсов по мере их завершения для получения результатов. Хотя другие способы также работают довольно хорошо. Поймите, что для настройки всего этого и транспортировки объектов в процессы и из процессов требуется время — YMMV в зависимости от фактической загрузки процессора или времени выполнения задачи.5. пул = ProcessPoolExecutor(14) все та же скорость, очень медленная