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

2024-09-27 23:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

因此,我的函数接受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))

这将返回错误:

functionExample() missing 3 required positional arguments: 'lookup1', 'lookup2', and 'lookup3'

然后,我尝试通过执行以下操作添加三个参数:

output1, output2= parallelize_dataframe(dataOfInterest, functionExample(lookup1, lookup2, lookup3))

这将返回下面的错误,表明它将这三个参数作为函数的前三个参数,并缺少第四个参数,而不是前一个错误表明缺少的最后三个参数:

functionExample() missing 1 required positional arguments: 'lookup1'

然后,如果我尝试通过执行以下操作来输入四个参数:

output1, output2= parallelize_dataframe(dataOfInterest, functionExample(dataOfInterest, lookup1, lookup2, lookup3))

它返回以下错误:

'tuple' object is not callable

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

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


Tags: 数据方法dataframedf参数numpoolparallelize
3条回答

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

from functools import partial


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

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

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

def f(dataOfInterest):
    return functionExample(dataOfInterest, lookup1=x, lookup2=y, lookup3=z)

通过这种方式,map()将如您所期望的那样工作

您可以通过^{}执行某些参数的部分绑定以创建新的可调用参数:

from functools import partial

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

请注意,在multiprocessing世界中,^{} can be slow,因此您可能希望找到一种方法来避免传递参数(如果参数太大/pickle代价太高),假设在您的用例中这是可能的

相关问题 更多 >

    热门问题