繁体   English   中英

如何同时多次运行同一个函数?

[英]How to run the same function multiple times simultaneously?

我有一个函数,它将数据帧作为输入并返回一个数据帧。 喜欢:

def process(df):
    <all the code for processing>
    return df
# input df has 250K rows and 30 columns
# saving it in a variable
result = process(df)
# transform input df into 10,000K rows and over 50 columns

它做了很多处理,因此需要很长时间才能返回输出。 我正在使用 jupyter 笔记本。

我提出了一个新函数,它基于原始 df 列上的某个类别过滤器将原始数据帧过滤成 5 个大小不相等但在 30K 到 100K 之间的块,并将其作为 process(df1)、process (df2)...等。 并将其保存为 result1、result 2 等,然后将结果合并为一个最终数据帧。

但我希望它们同时运行并自动组合结果。 就像一起运行 5 个进程函数的代码,一旦全部完成,它们就可以合并为一个,给我与之前相同的“结果”,但节省了大量的运行时间。

如果我可以将原始数据帧分成相等的部分并使用 process(df) 函数同时运行每个部分,那就更好了,就像它将这 250 k 行随机分成 5 个大小为 50k 的数据帧并将它们作为输入发送到进程( df) 五次并并行运行它们并给我相同的最终输出,我现在可以在没有任何优化的情况下获得相同的最终输出。

我阅读了很多关于多线程的书,并在堆栈溢出方面找到了一些有用的答案,但我无法真正让它发挥作用。 我对多线程的概念非常陌生。

您可以为此使用多处理库,它允许您在 CPU 的不同内核上运行一个函数。

下面是一个例子

from multiprocessing import Pool

def f(df):
    # Process dataframe
    return df

if __name__ == '__main__':
    dataframes = [df1, df2, df3]

    with Pool(len(dataframes)) as p:
        proccessed_dfs = p.map(f, dataframes)
    
    print(processed_dfs)

    # You would join them here

您应该检查 dask ( https://dask.org/ ),因为您似乎主要对数据帧进行操作。 一个很大的优势是您不必担心手动拆分数据帧的所有细节以及所有这些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM