python - 如何在python中包装列表函数?
问题描述
我无法准确地将这个问题反映到标题中。我想使用list
,func(*args)
并且Pool.map
没有错误。请看下文。
▼代码
def df_parallelize_run(func, arguments):
p = Pool(psutil.cpu_count())
df = p.map(func, arguments)
p.close()
p.join()
return df
def make_lag(df: DataFrame, LAG_DAY: list):
for l in LAG_DAY:
df[f'lag{l}d'] = df.groupby(['id'])['target'].transform(lambda x: x.shift(l))
return df
def wrap_make_lag(args):
return make_lag(*args)
鉴于以上三个功能,我想做以下
# df: DataFrame
arguments = (df, [1, 3, 7, 13, 16])
df = df_parallelize_run(wrap_make_lag, arguments)
▼ 错误
in df_parallelize_run(func, arguments)
----> 7 df = pool.map(func, arguments)
in ..../python3.7/multiprocessing/pool.py in map(self, func, iterable, chunksize)
--> 268 return self._map_async(func, iterable, mapstar, chunksize).get()
in ..../python3.7/multiprocessing/pool.py in get(self, timeout)
--> 657 raise self._value
TypeError: make_lag() takes 2 positional arguments but 5 were given
我知道这种不匹配的原因(由于解包列表,[1, 3, 7, 13, 16]
即 5)。如何正确做?如果可能的话,我想将此列表放在位置参数的约束范围内。如果几乎不可能(list
或Pool.map
),有什么更合适、更简单、更灵活的方式?
解决方案
使用pool.starmap
. 您为函数的参数生成一个元组列表。在这里,看起来 df 每次都是相同的,而 arg 是参数中的每个元素。
arglist = [(df, arg) for arg in arguments]
with multiprocessing.Pool(multiprocessing.cpu_count()) as p:
results = p.starmap(make_lag, arglist)
推荐阅读
- mysql - 字段列表中的未知列“r”
- flutter - Flutter 导航如何移动到每个项目的第二页
- python - Pandas read_sql 列不正确
- docker - 如何在 VSCode 开发容器中使用 USB/COM 端口?
- php - 错误:运行 composer install 时“提取 zip 文件需要 ZipArchive”;与流行!_OS 21 宇宙
- flutter - 颤振通道主错误请在切换分支之前提交您的更改或存储它们
- php - 如何更改实体默认显示视图上的数据
- node.js - 如何在 Github 中指定操作/设置节点的路径
- javascript - 如何在 vue 中使用打字稿
- regex - 提取以字符串编码的长度字符串的正则表达式