2

我看到參考文獻here,並試圖使用該方法for我的for循環,但它似乎沒有按預期工作。爲什麼多處理性能不可見?

def concatMessage(obj_grab, content): 
    for logCatcher in obj_grab: 
     for key in logCatcher.dic_map: 
      regex = re.compile(key) 
      for j in range(len(content)): 
       for m in re.finditer(regex, content[j]): 
        content[j] += "   " + logCatcher.index + "  " + logCatcher.dic_map[key] 
    return content 

def transferConcat(args): 
    return concatMessage(*args) 

if __name__ == "__name__": 
    pool = Pool() 
    content = pool.map(transferConcat, [(obj_grab, content)])[0] 
    pool.close() 
    pool.join() 

我想提高for循環的性能,因爲它需要22秒才能運行。

當我直接運行該方法時,它也需要大約22秒。

看來增強失敗了。

我該怎麼做才能提高我的循環速度? 爲什麼pool.map不適用於我的情況?


後nablahero提醒,我修改如下我的代碼:

if __name__ == "__main__": 
    content = input_file(target).split("\n") 
    content = manager.list(content) 
    for files in source: 
     obj_grab.append((LogCatcher(files), content)) 
    pool = Pool() 
    pool.map(transferConcat, obj_grab) 
    pool.close() 
    pool.join() 

def concatMessage(LogCatcher, content): 
    for key in LogCatcher.dic_map: 
     regex = re.compile(key) 
     for j in range(len(content)): 
      for m in re.finditer(regex, content[j]): 
       content[j] += LogCatcher.index + LogCatcher.dic_map[key] 

def transferConcat(args): 
    return concatMessage(*args) 

漫長的等待後,就引起了82秒完成...

爲什麼我有這種情況?我如何修改我的代碼?


obj_grab是一個列表,其中包含不同的文件的logCatchers intput 內容是我想Concat的文件和使用管理器(),讓多進程CONCAT相同的文件。

+0

你是什麼意思「表現是隱形的」?什麼樣的表現是可見的? – number5

+0

無關,但您可以遍歷內容而不是索引 –

+0

此示例代碼將比等效的順序代碼慢*。你所做的只是在子進程中運行一個函數,然後等待它完成。 IPC將該函數及其參數發送給子進程的成本將比使用全部父進程運行時慢。 'Pool.map'只有在你用它來並行運行很多函數時纔有用。 – dano

回答

2

什麼是obj_grab和內容?我猜它只包含一個對象,所以當你啓動你的Pool時,你只需調用一次函數transferConcat,因爲你只有一個obj_grab和content對象。

如果您使用地圖再看一下您的參考。 obj_grab和內容必須是對象列表才能加快程序的速度,因爲它會使用不同的obj_grab和content來多次調用該函數。

pool.map不會加速函數本身 - 該函數只是與不同的數據並行調用多次!

我希望清除一些東西。