【发布时间】:2020-01-15 17:32:48
【问题描述】:
我想使用 mutliprocessing.pool 方法并行计算。问题是我想在计算中使用的函数提供了两个 args 和可选的 kwargs,第一个参数是数据帧,第二个参数是 str,任何 kwargs 是字典。
对于我尝试执行的所有计算,我想要使用的数据框和字典都是相同的,只有第二个 arg 是不断变化的。因此,我希望能够使用 map 方法将它作为不同字符串的列表传递给带有 df 和 dict 的已打包函数。
from utils import *
import multiprocessing
from functools import partial
def sumifs(df, result_col, **kwargs):
compare_cols = list(kwargs.keys())
operators = {}
for col in compare_cols:
if type(kwargs[col]) == tuple:
operators[col] = kwargs[col][0]
kwargs[col] = list(kwargs[col][1])
else:
operators[col] = operator.eq
kwargs[col] = list(kwargs[col])
result = []
cache = {}
# Go through each value
for i in range(len(kwargs[compare_cols[0]])):
compare_values = [kwargs[col][i] for col in compare_cols]
cache_key = ','.join([str(s) for s in compare_values])
if (cache_key in cache):
entry = cache[cache_key]
else:
df_copy = df.copy()
for compare_col, compare_value in zip(compare_cols, compare_values):
df_copy = df_copy.loc[operators[compare_col](df_copy[compare_col], compare_value)]
entry = df_copy[result_col].sum()
cache[cache_key] = entry
result.append(entry)
return pd.Series(result)
if __name__ == '__main__':
ca = read_in_table('Tab1')
total_consumer_ids = len(ca)
base = pd.DataFrame()
base['ID'] = range(1, total_consumer_ids + 1)
result_col= ['A', 'B', 'C']
keywords = {'Z': base['Consumer archetype ID']}
max_number_processes = multiprocessing.cpu_count()
with multiprocessing.Pool(processes=max_number_processes) as pool:
results = pool.map(partial(sumifs, a=ca, kwargs=keywords), result_col)
print(results)
但是,当我运行上面的代码时,我收到以下错误:TypeError: sumifs() missing 1 required positional argument: 'result_col'。如何为函数提供第一个 arg 和 kwargs,同时提供第二个参数作为 str 列表,以便我可以并行化计算?我在论坛中阅读了几个类似的问题,但似乎没有一个解决方案适用于这种情况......
谢谢你,如果有什么不清楚的地方,我很抱歉,我今天才知道多处理包!
【问题讨论】:
-
尝试发送带有 ** 前缀的
keywords参数,不带kwargs键。此外,请查看以下链接以获取有关调用Pool.map函数的更多信息。 stackoverflow.com/questions/59611745/… -
@Amiram 我已经尝试过了,但它会产生相同的错误:` sumifs() missing 1 required positional argument: 'result_col' `
标签: python multiprocessing pool args keyword-argument