Python 并行化一个包含多个参数但超过其中一个参数的函数

Python 并行化一个包含多个参数但超过其中一个参数的函数,python,python-3.x,Python,Python 3.x,我有处理相对较大的数据帧的功能,运行时间需要相当长的时间。我在寻找提高运行时间的方法,我遇到了多处理池。如果我理解正确的话,它应该并行地为数据帧的相等块运行函数,这意味着它可能运行得更快,节省时间 因此,我的函数接受4个不同的参数,最后三个主要是查找,而四个参数中的第一个是感兴趣的数据帧。看起来是这样的: def functionExample(dataOfInterest, lookup1, lookup2, lookup3): #do stuff with the data and

我有处理相对较大的数据帧的功能,运行时间需要相当长的时间。我在寻找提高运行时间的方法,我遇到了多处理池。如果我理解正确的话,它应该并行地为数据帧的相等块运行函数,这意味着它可能运行得更快,节省时间

因此,我的函数接受4个不同的参数,最后三个主要是查找,而四个参数中的第一个是感兴趣的数据帧。看起来是这样的:

def functionExample(dataOfInterest, lookup1, lookup2, lookup3):
    #do stuff with the data and lookups)
    return output1, output2
因此,根据我所读的内容,我得出以下我认为应该有效的方法:

num_partitions = 4
num_cores = 4

def parallelize_dataframe(df, func):
    df_split = np.array_split(df, num_partitions)
    pool = Pool(num_cores)
    df = pd.concat(pool.map(func, df_split))
    pool.close()
    pool.join()
    return df
然后,为了调用流程(主要是我无法理解),我尝试了以下方法:

output1, output2= parallelize_dataframe(dataOfInterest, functionExample))
output1, output2= parallelize_dataframe(dataOfInterest, functionExample(lookup1, lookup2, lookup3))
output1, output2= parallelize_dataframe(dataOfInterest, functionExample(dataOfInterest, lookup1, lookup2, lookup3))
这将返回错误:

functionExample() missing 3 required positional arguments: 'lookup1', 'lookup2', and 'lookup3'
然后,我尝试通过执行以下操作添加三个参数:

output1, output2= parallelize_dataframe(dataOfInterest, functionExample))
output1, output2= parallelize_dataframe(dataOfInterest, functionExample(lookup1, lookup2, lookup3))
output1, output2= parallelize_dataframe(dataOfInterest, functionExample(dataOfInterest, lookup1, lookup2, lookup3))
这将返回下面的错误,表明它将这三个参数作为函数的前三个参数,并缺少第四个参数,而不是前一个错误表明缺少的最后三个参数:

functionExample() missing 1 required positional arguments: 'lookup1'
然后,如果我尝试通过执行以下操作来输入四个参数:

output1, output2= parallelize_dataframe(dataOfInterest, functionExample))
output1, output2= parallelize_dataframe(dataOfInterest, functionExample(lookup1, lookup2, lookup3))
output1, output2= parallelize_dataframe(dataOfInterest, functionExample(dataOfInterest, lookup1, lookup2, lookup3))
它返回以下错误:

'tuple' object is not callable
我不太确定上面哪一个是做这件事的方法,如果有的话。它应该接受所有函数参数,包括所需的数据帧。如果是这样,为什么它会抱怨元组呢

任何帮助都将不胜感激!
谢谢。

在每种情况下,您都试图调用函数,而不是在调用函数时传递参数。您需要的是一个新的callable,它使用正确的参数调用原始的callable

from functools import partial


output1, output2 = parallelize_dataframe(
    dataOfInterest,
    partial(functionExample, lookup1=x, lookup2=y, lookup3=z)
)

您可以通过以下方式执行某些参数的部分绑定以创建新的可调用参数:


请注意,在
多处理
世界中,如果参数太大/pickle代价太高,那么您可能希望找到一种方法来避免传递参数,假设在您的用例中这是可能的。

您可以简单地修改您的函数定义,以采用预定义的参数,或者使用该参数创建一个调用原始函数的函数

def functionExample(dataOfInterest, lookup1=x, lookup2=y, lookup3=z):
    #do stuff with the data and lookups)
    return output1, output2


这样,
map()

我正要说那是行不通的;他们正在使用
多处理
,但从我开始评论到现在,您用
部分
(可拾取,但可能较慢)替换了
lambda(不可拾取)。:-)酷,我忘了腌制是个问题。旧版本主要是为了避免假设OP知道参数名,这将排除使用关键字参数。非常感谢。这就解决了它(它现在正在运行,将测试它是否通过并被证明更快),至于部分,我想我会支持下面@alec_djinn的建议,这应该是解决部分问题的一种方法。干杯谢谢你,这是一种有效的方法,可以避免使用partial。你能分享更多关于这方面的信息吗?数据帧和函数看起来像什么?