我有 2 個文本檔案。我想在它們兩個中找到一個字母(例如:“L”)的頻率。有沒有辦法應用 ThreadPoolExecutor 或 ProcessPoolExecutor 使其更快?
到目前為止,我已經嘗試過它只會增加花費的時間。
def countFreq(data):
res = {i : data.count(i) for i in set(data)}
print(res)
這是我正在使用的頻率計數功能。我也將文本檔案轉換為字串。
#Normal method
start = time.time()
countFreq(str1)
countFreq(str2)
end = time.time()
print(f"Time taken: {end-start:.5f} seconds\n")
上面的比下面的代碼快,這是為什么
#Method multiprocessing
start = time.time()
p1 = multiprocessing.Process(countFreq(str1))
p2 = multiprocessing.Process(countFreq(str2))
p1.start()
p2.start()
p1.join()
p2.join()
end = time.time()
print(f"Time taken: {end-start:.5f} seconds\n")
關于如何更快地運行它們的任何想法?是 IO 相關問題還是處理相關問題?
uj5u.com熱心網友回復:
使用并行/并發編程不一定會提高程式的速度,有時最好保持順序,特別是如果我們期望這些執行緒/行程做的是計算文本檔案中的每個字母。
創建一個新行程需要大量資源并使用您的 CPU 來并行運行它們。與使用執行緒執行相同操作相比,生成和管理行程需要大量的計算時間和能力,但即使如此也不能保證。
為了只計算 2 個檔案,我會嘗試執行緒/保持順序。當檔案數量變大時,我們基本上會注意到順序和并行的加速比之間的差異。
有關更多資訊,我強烈建議閱讀有關阿姆達爾定律的內容。
作為旁注,您應該將函式地址傳遞給target內部引數multiprocessing.Process,并將引數傳遞給args引數。請注意,它應該是型別,Tuple[Any]因此您應該添加一個尾隨逗號:target=countFreq, args=(str1,)
import time
import multiprocessing
def count_freq(data):
res = {i: data.count(i) for i in set(data)}
print(res)
def text_to_string(path):
with open(path, 'r') as file_handler:
return file_handler.read()
def main():
start = time.time()
count_freq(text_to_string('./text1'))
count_freq(text_to_string('./text2'))
# about 0.001
end = time.time()
print(f'sequential: {end - start} s')
start = time.time()
p1 = multiprocessing.Process(target=count_freq, args=(text_to_string('./text1'),))
p2 = multiprocessing.Process(target=count_freq, args=(text_to_string('./text2'),))
p1.start()
p2.start()
p1.join()
p2.join()
end = time.time()
print(f'concurrent: {end - start} s')
if __name__ == '__main__':
main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349301.html
