【发布时间】:2016-01-23 00:17:49
【问题描述】:
我正在尝试使用带有pool.map 的多处理来加速函数的执行,但可迭代不是该函数的第一个参数。 Lambda 不起作用,因为它们不可腌制。我尝试使用functools.partial 创建一个新函数,但它以TypeError 失败。下面是一个非常简单的示例,结果相同。如果我将参数顺序切换为f(i, s1, s2),它会按预期工作。
为什么参数顺序在这里很重要?当我阅读doc 时,这对我来说并不明显。
我有什么选择(除了明显的改变原始功能)?
import multiprocessing
from functools import partial
def f(s1, s2, i):
return [s1] + [s2]*i
def main():
# other code... constants for f aren't known until runtime
pool = multiprocessing.Pool()
func = partial(f, s1='a', s2='c')
for strings in pool.map(func, range(10)):
print(strings)
pool.close()
pool.join()
if __name__ == '__main__':
main()
更新: 我能想到的最好的方法是在模块级别创建一个包装器来切换参数顺序,然后是包装器的一部分。看起来一点也不漂亮或看起来像蟒蛇。
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()
【问题讨论】:
标签: python multiprocessing functools