Python multiprocessing.Pool.map не ускоряет код частичной функцииPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python multiprocessing.Pool.map не ускоряет код частичной функции

Сообщение Anonymous »

Я пытаюсь выполнить задачу повторной выборки и пытаюсь использовать многопроцессорность для ускорения кода. Моя цель — ускорить код следующим образом:

Код: Выделить всё

import numpy as np
def jackknife_resampling(value, weight, label):
# label is an integer array, marking the subsample
def _resample(i):
_value = value[label != i]
_weight = weight[label != i]
return np.average(_value, weights=_weight)
return list(map(_resample, np.unique(label)))
Чтобы использовать многопроцессорность, мне нужно заменить карту на Pool.map и удалить функцию _resample.

Код: Выделить всё

from functools import partial
from multiprocessing import Pool
def _resample(value, weight, label, i):
_value = value[label != i]
_weight = weight[label != i]
return np.average(_value, weights=_weight)
def jackknife_resampling_mp(value, weight, label, Npro):
my_pool = Pool(Npro)
return my_pool.map(partial(_resample, value, weight, label), np.unique(label))

if __name__ == '__main__':
Nsamp = 1_0_000_000
value = np.random.uniform(0, 1, size=Nsamp)
weight = np.random.uniform(1, 2, size=Nsamp)
label = np.random.randint(0, 200, size=Nsamp)
t = time.time()
jackknife_resampling_mp(value, weight, label, 40)
print('time', time.time()-t)
Поскольку функции _resample все еще нужны исходное значение и вес, поэтому я использовал частичное для перехода к ней. Но оказывается, что это не ускорило код. Чтобы доказать, что Pool.map действительно работает, я использую глобальную переменную, и она работает хорошо.

Код: Выделить всё

def _resample(i):
global value, weight, label
_value = value[label != i]
_weight = weight[label != i]
return np.average(_value, weights=_weight)

def jackknife_resampling_mp(_value, _weight, _label, Npro):
global value, weight, label
value = _value
weight = _weight
label = _label
# label is a integer array, marking the subsample
my_pool = Pool(Npro)
return my_pool.map(_resample, np.unique(label))
это работает, но мне кажется, это довольно некрасиво. PS: Я также попробовал преобразовать весь ресэмплер в класс, что аналогично тому, как я использовал частичный(я использую Python 3.12, чтобы можно было замариновать метод экземпляра).
Почему это? И есть ли лучший способ сделать это?


Подробнее здесь: https://stackoverflow.com/questions/790 ... l-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python multiprocessing.Pool.map не ускоряет код частичной функции
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Python multiprocessing.Pool.map не ускоряет код частичной функции
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Python Multiprocessing Queue Pool работает в функциональном коде, но не в ООП
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Python Multiprocessing.pool висит под запуска Debugpy в Windows («Spawn»), даже с Freeze_support
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Оптимизирующая функция с использованием multiprocessing.Pool()
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»