我看到參考文獻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相同的文件。
你是什麼意思「表現是隱形的」?什麼樣的表現是可見的? – number5
無關,但您可以遍歷內容而不是索引 –
此示例代碼將比等效的順序代碼慢*。你所做的只是在子進程中運行一個函數,然後等待它完成。 IPC將該函數及其參數發送給子進程的成本將比使用全部父進程運行時慢。 'Pool.map'只有在你用它來並行運行很多函數時纔有用。 – dano