python functools的参数顺序
我正在尝试将多处理与python functools的参数顺序,python,multiprocessing,functools,Python,Multiprocessing,Functools,我正在尝试将多处理与pool.map结合使用,以加快函数的执行速度,但iterable不是该函数的第一个参数。Lambdas不起作用,因为它们不可腌制。我试图使用functools.partial创建一个新函数,但由于TypeError而失败。下面是一个具有相同结果的非常简单的示例。如果我将参数顺序切换为f(I,s1,s2),它将按预期工作 为什么论点顺序在这里很重要?当我读这本书时,它对我来说并不明显 我的选择是什么(除了改变原来的功能之外) 更新: 我能想到的最好方法是在模块级创建一个包装器
pool.map
结合使用,以加快函数的执行速度,但iterable不是该函数的第一个参数。Lambdas不起作用,因为它们不可腌制。我试图使用functools.partial
创建一个新函数,但由于TypeError
而失败。下面是一个具有相同结果的非常简单的示例。如果我将参数顺序切换为f(I,s1,s2)
,它将按预期工作
为什么论点顺序在这里很重要?当我读这本书时,它对我来说并不明显
我的选择是什么(除了改变原来的功能之外)
更新:
我能想到的最好方法是在模块级创建一个包装器来切换参数顺序,然后从包装器中创建一个分部。看起来一点也不漂亮或者看起来像蟒蛇
import multiprocessing
from functools import partial
def f(s1, s2, i):
return [s1] + [s2]*i
def wrapper(i, s1, s2):
return f(s1, s2, i)
def main():
# other code... constants for f aren't known until runtime
pool = multiprocessing.Pool()
func = partial(wrapper, s1='foo', s2='bar')
for strings in pool.map(func, range(10)):
print(strings)
pool.close()
pool.join()
if __name__ == '__main__':
main()
顺序很重要,因为
pool.map
正在调用f(i,s1='a',s2='c')
。
你可以这样写你的部分:
import multiprocessing
def f(s1, s2, i):
return [s1] + [s2]*i
def f2(i):
return f('a','c',i)
if __name__ == '__main__':
pool = multiprocessing.Pool()
for strings in pool.map(f2, range(10)):
print(strings)
pool.close()
pool.join()
如果您使用的是python3.3,pool.starmap
可供您使用:
import multiprocessing
from itertools import repeat
def f(s1, s2, i):
return [s1] + [s2]*i
if __name__ == '__main__':
pool = multiprocessing.Pool()
for strings in pool.starmap(f, zip(repeat('a'), repeat('c'), range(10))):
print(strings)
pool.close()
pool.join()
我不能用f2之类的东西硬编码参数。这些值直到运行时才知道。我将修改我的问题,使之更清楚。而且我仍然不明白为什么参数顺序会导致这个错误。Thanks@user2133814对不起,我的意思是调用
f(i,s1='a',s2='c')
而不是func(i,s1='a',s2='b')
。换句话说,partial
返回一个带有3个参数的可调用对象,其中2个现在具有默认值。
import multiprocessing
from itertools import repeat
def f(s1, s2, i):
return [s1] + [s2]*i
if __name__ == '__main__':
pool = multiprocessing.Pool()
for strings in pool.starmap(f, zip(repeat('a'), repeat('c'), range(10))):
print(strings)
pool.close()
pool.join()