簡體   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