簡體   English   中英

如何在這個 for 循環上使用多線程來減少執行時間?

[英]How to use multi threading on this for loop to decrease the execution time?

我有一個文件夾,其中包含 1000 個文件夾,其中有 1000 個文件。

cb = []

for root, dirs, files in os.walk(dir):
    for name in files:
        filepath = root + os.sep + name
        df = pd.read_csv(filepath,index_col=False)
        df['TimeStamp'] = pd.to_datetime(df.TimeStamp, format = '%Y-%m-%d %H:%M:%S')
        date = df['TimeStamp'].dt.date.values[0]
        time = df['TimeStamp'].dt.time.values[0]
        
        if (df.shape[0] > 0):
               cb.append({'Time': time, 'Date': date})

我需要打開所有文件並對它們進行一些數據處理並將數據附加到空數據幀。

按順序運行需要幾天時間,有沒有辦法可以使用多處理/線程來減少時間而不是跳過進程中的任何文件?

您可以將每個文件的工作放入單獨的函數中,然后使用多處理池將處理推送到單獨的進程。 這有助於 CPU 限制計算,但文件讀取所需的時間與原始串行處理時間一樣長。 多處理的技巧是將流經池本身的數據量保持在最低限度。 由於在此示例中您只傳遞了一個文件名並返回了幾個日期時間對象,因此您在這一點上做得很好。

import multiprocessing as mp
import pandas as pd
import os

def worker(filepath):
    df = pd.read_csv(filepath,index_col=False)
    df['TimeStamp'] = pd.to_datetime(df.TimeStamp, format = '%Y-%m-%d %H:%M:%S')
    date = df['TimeStamp'].dt.date.values[0]
    time = df['TimeStamp'].dt.time.values[0]

    if (df.shape[0] > 0):
         return({'Time': time, 'Date': date})
    else:
        return None

if __name__ == "__main__":
    csv_files = [root + os.sep + name 
        for root, dirs, files in os.walk(dir)
        for name in files]
    with mp.Pool() as pool:
        cb = [result for result in pool.map(worker, csv_files, chunksize=1) 
                if result]

    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM