Использование многопроцессорной обработки с несколькими возвращаемыми значениями и упорядоченными словарями

Я хотел бы использовать многопроцессорность для генерации матрицы переходов цепи Маркова.

Функция generateKeys() генерирует словарь с новыми скоростями и словарь с новыми ключами для каждого состояния в пространстве состояний после выполнения перехода.

from collections import OrderedDict

def generateKeys():
    idxDict = OrderedDict()
    rateDict = OrderedDict()
    for key,state in stateDict.items():            
        newkeys,rates = transitionFunction(state)              
        idxDict[key] = newkeys
        rateDict[key] = rates
    return idxDict,rateDict

Причина использования OrderedDict вот что ключи путаются с обычным dict на следующем шаге (на следующем шаге я объединяю массивы numpy в словарях и сохраняю их в разреженном coo_matrix).

Поскольку ключи словаря уникальны, должна быть возможность generateKeys() параллельно и заполняют два словаря намного быстрее на многоядерном компьютере.

Я посмотрел в multiprocessing пакет и некоторые примеры, но примеры, которые я видел, были для одного возвращаемого значения и без упорядоченных словарей. Я пока не очень понимаю, как применять его в моей обстановке. Кто-нибудь может показать мне, как это работает?

2 ответа

Решение

Если transitionFunction можете применять ваши штаты в любом порядке:

transitionFunction('A')
transitionFunction('B')

# is equivalent to
transitionFunction('B')
transitionFunction('A')

Ты можешь использовать:

from multiprocessing import Pool, cpu_count

p = Pool(cpu_count())
results = p.map(transitionFunction, stateDict.values())

results будет иметь тот же порядок, что и значения stateDict Затем вы можете построить свой диктат с помощью:

idxDict = dict(zip(stateDict.keys(), i[0] for i in results))
rateDict = dict(zip(stateDict.keys(), i[1] for i in results))

Если transitionFunction нельзя применять ваши штаты в любом порядке, тогда у вас будут непредсказуемые результаты...

Кажется, есть решение для совместного использования словаря между независимыми процессами. Ищите здесь для описания. ИМХО это самый простой способ справиться с вашей проблемой. Однако это решение не поддерживает OrderedDict, Так что, если вы сможете найти способ сделать это без них, это сработает. Может быть, вы могли бы передать / преобразовать ваш диктант впоследствии в желаемую форму.

Другие вопросы по тегам