Использование многопроцессорной обработки с несколькими возвращаемыми значениями и упорядоченными словарями
Я хотел бы использовать многопроцессорность для генерации матрицы переходов цепи Маркова.
Функция 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
, Так что, если вы сможете найти способ сделать это без них, это сработает. Может быть, вы могли бы передать / преобразовать ваш диктант впоследствии в желаемую форму.