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()