Python在使用多处理和itertools时传递多个值
我正在尝试使用多重处理对itertools生成的组合进行一些计算。Python在使用多处理和itertools时传递多个值,python,multiprocessing,itertools,Python,Multiprocessing,Itertools,我正在尝试使用多重处理对itertools生成的组合进行一些计算。 以下是我正在做的一个简单版本: import multiprocessing import itertools def func(comb): x=list(comb)[0] y=zs[x] return x+y if __name__ == '__main__': cores=multiprocessing.cpu_count() pool=multiprocessing.Pool(pr
以下是我正在做的一个简单版本:
import multiprocessing
import itertools
def func(comb):
x=list(comb)[0]
y=zs[x]
return x+y
if __name__ == '__main__':
cores=multiprocessing.cpu_count()
pool=multiprocessing.Pool(processes=cores)
xs=range(50)
ys=range(50)
zs=[iy+1 for iy in ys]
for r in pool.imap(func,itertools.product(xs,ys)):
print(r)
但这带来了一个错误:
NameError:未定义名称“zs”
使用itertools.product
时如何将zs
传递到func
非常感谢您的评论。您可以使用分部函数设置函数的分部参数,如下所示
从functools导入部分
def func(梳,zs):
打印(梳,zs)
pfunc=部分(func,zs=“abc”)
pfunc(“123”)
#123美国广播公司
您可以使用partial function设置函数的部分参数,如下所示
从functools导入部分
def func(梳,zs):
打印(梳,zs)
pfunc=部分(func,zs=“abc”)
pfunc(“123”)
#123美国广播公司
您需要将zs
传递到func
。在func
中调用global zs
也可以,但我不是100%确定。@Ahndwoo不,至少不是在每个平台上都可以,因为模块级的zs
是在主文件保护中定义的,而不是在派生子进程的窗口上执行。但无论如何,全局变量是个坏主意。一个函数/方法应该得到它所需要的一切,而不仅仅是常数作为参数。@BlackJack我想可能是这样的。谢谢您需要将zs
传递到func
。在func
中调用global zs
也可以,但我不是100%确定。@Ahndwoo不,至少不是在每个平台上都可以,因为模块级的zs
是在主文件保护中定义的,而不是在派生子进程的窗口上执行。但无论如何,全局变量是个坏主意。一个函数/方法应该得到它所需要的一切,而不仅仅是常数作为参数。@BlackJack我想可能是这样的。谢谢