我有一个非常大的 Pandas 数据框,我需要在其上应用一些功能。整个过程大约需要 10 秒,我想知道我是否可以在 apply 函数上使用并行化来加快这个过程。
在互联网上搜索时,我遇到了这个 answer,我试了一下,因为其他像 pandarallel 对我来说不起作用。
所以,我的代码如下所示:
def getRightNeighbours(row, df):
...
def parallelize(data, func, num_of_processes=4):
data_split = np.array_split(data, num_of_processes)
pool = Pool(num_of_processes)
data = pd.concat(pool.map(func, data_split))
pool.close()
pool.join()
return data
def run_on_subset(func, data_subset, full_df):
return data_subset.apply(func, args=(full_df,), axis=1)
def parallelize_on_rows(data, func, num_of_processes=4):
return parallelize(data, partial(run_on_subset, func, full_df=data), num_of_processes)
if __name__ == '__main__':
df['right_neighbour'] = parallelize_on_rows(df, getRightNeighbours)
df['bottom_neighbour'] = parallelize_on_rows(df, getBottomNeighbours)
df['top_neighbour'] = parallelize_on_rows(df, getTopNeighbours)
df['left_neighbour'] = parallelize_on_rows(df, getLeftNeighbours)
(应用的函数必须能够访问完整的数据帧才能运行,这就是我将其作为参数传递的原因)
结果是执行时间超过 40 秒。因此,不但没有改善,反而变得更糟。
我做错了吗?有没有更好的方法来缩短执行时间?