Итак, я посмотрел как документацию модуля многопроцессорной обработки, так и другие заданные здесь вопросы, но ни один из них не похож на мой случай, поэтому я начал новый вопрос.
Для простоты у меня есть фрагмент кода:
# simple dataframe of some users and their properties.
data = {'userId': [1, 2, 3, 4],
'property': [12, 11, 13, 43]}
df = pd.DataFrame.from_dict(data)
# a function that generates permutations of the above users, in the form of a list of lists
# such as [[1,2,3,4], [2,1,3,4], [2,3,4,1], [2,4,1,3]]
user_perm = generate_permutations(nr_perm=4)
# a function that computes some relation between users
def comp_rel(df, permutation, user_dict):
df1 = df.userId.isin(permutation[0])
df2 = df.userId.isin(permutation[1])
user_dict[permutation[0]] += permutation[1]
return user_dict
# and finally a loop:
user_dict = defaultdict(int)
for permutation in user_perm:
user_dict = comp_rel(df, permutation, user_dict)
Я знаю, что этот код имеет очень мало (если вообще есть) смысла сейчас, но я просто написал небольшой пример это близко к структуре реального кода, над которым я работаю. Это user_dict
должно наконец содержать userIds
и некоторое значение.
У меня есть реальный код, и он отлично работает, дает правильный dict и все, но ... он работает в одном потоке. И это мучительно медленно, учитывая, что у меня есть еще 15 совершенно бесплатных тем.
У меня вопрос: как я могу использовать модуль multiprocessing
из python, чтобы изменить последний для l oop и иметь возможность работать на всех доступных потоках / ядрах? Я посмотрел на документацию, это не очень легко понять.
РЕДАКТИРОВАТЬ: я пытаюсь использовать пул как:
p = multiprocessing.Pool(multiprocessing.cpu_count())
p.map(comp_rel(df, permutation, user_dict), user_perm)
p.close()
p.join()
однако это ломается, потому что я использую строку:
user_dict = comp_rel(df, permutation, user_dict)
в исходном коде, и я не знаю, как эти словари должны быть объединены после завершения пула.