python - 如何使用 f(var, param1, param2, ...) 正确使用多处理
问题描述
让我们考虑一个函数 f,它有一个要映射的参数(变化)和几个固定参数:
f(var, param1, param2, param3, param4)
它们是param i
固定值(如 int、float、booleans...),var
参数是对象列表。
目前的做法:
p1 = 0
p2 = 200
var = [[Object(x, p1, p2), Object(y, p1, p2), Object(z, p1, p2 = test = True)] for x in range(5) for y in range(10) for z in range(25)]
for v in var:
f(v, param1, param2, param3, param4)
由于对一个元素的计算var
不依赖于其他元素,因此我实际上对列表var
进行了切片,并使用 N 个不同的切片启动程序 N 次,因此我在计算机的 N 个内核上运行了 N 个程序。这是一种手动进行多处理的方法。但是,跟踪已完成的内容和仍需计算的内容并不是很方便。
我想直接在程序中实现多线程/多处理。
没有 fix 参数,我发现这种方式似乎可行:
from multiprocessing import Pool
p = Pool(processes = 16) # 16 cores.
p.map(f, var)
p.terminate()
对于上面的小代码,我没有使用相同的 f 函数,它仅用于测试目的。我如何使用也具有固定参数的 f 函数来做到这一点?
什么是最好的方法?谢谢!
蟒蛇版本:3.6
编辑:我还想跟踪进展情况。目前,我的代码是:
for i,v in enumerate(var):
print ("{} / {}".format(i, len(var))
f(v, param1, param2, param3, param4)
多处理也可以做到这一点吗?
解决方案
如果我理解你,你的问题可以重写为:
如何使用多处理轻松映射具有多个固定参数的函数?
像p.starmap(f, [(v, fix1, fix2, fix3) for v in dynamics])
什么?
我认为你可以包装你的f
功能。
例如:
def fixed_para_wrapper(dynamic):
return f(dynamic, fix1, fix2, fix3)
然后你可以像p.map(fixed_para_wrapper, dynamics)
.
推荐阅读
- github - 拒绝主 -> 主(先获取)在 GitHub 中面临这个问题
- python - 如何将服务器端 API 添加到 Django 管理网站?
- python-3.x - 如何在输入字段中保留信息 - Python/Selenium
- perl - perl 中的可否定选项
- properties - 这是一种反模式/代码气味吗?- 使用枚举/常量类通过 [] 而不是使用点属性访问类属性
- openssl - openssl CSR 生成给出 Expecting: CERTIFICATE REQUEST
- python - Macbook ModuleNotFoundError 上的致命 Python 错误:没有名为“编码”的模块
- typescript - 基于模板变量的打字稿强制函数返回类型
- testing - 手动和自动化测试用例编写和存储
- image-processing - 为什么 Mean-Shift Clustering 在图像异常检测中返回 1?哪些参数对这个算法很重要?