[英]Python Too slow using multiprocess when reading a file
當我在沒有多進程的情況下讀取文件時,它需要 0.16 秒,但是當我使用多進程時,它需要 0.36 秒。 為什么使用多進程比單線程需要更長的時間?
下面的代碼是我想讀取一個文件並將文件分成10個並比較行
沒有多進程的代碼
import time
result = []
def get_match(lines, num):
outer_lines = lines[:num]
inner_lines = lines[1:]
for f1 in outer_lines:
# print('f1', f1)
for f2 in inner_lines:
result.append(f1)
result.append(f2)
# print('f2', f2)
# print('compare file line by line')
# print('store int into global result variable')
if __name__ == '__main__':
atime = time.time()
split_n = 10
with open('10000.txt', 'r') as file:
line1 = file.readlines()
line2 = line1[split_n:]
line3 = line2[split_n:]
line4 = line3[split_n:]
line5 = line4[split_n:]
line6 = line5[split_n:]
line7 = line6[split_n:]
line8 = line7[split_n:]
line9 = line8[split_n:]
line10 = line9[split_n:]
t1 = get_match(line1,split_n,)
t2 = get_match(line2,split_n,)
t3 = get_match(line3,split_n,)
t4 = get_match(line4,split_n,)
t5 = get_match(line5,split_n,)
t6 = get_match(line6,split_n,)
t7 = get_match(line7,split_n,)
t8 = get_match(line8,split_n,)
t9 = get_match(line9,split_n,)
t10 = get_match(line10,split_n,)
btime = time.time()
print(btime-atime)
多進程代碼
from multiprocessing import Process
import time
result = []
def get_match(lines, num):
outer_lines = lines[:num]
inner_lines = lines[1:]
for f1 in outer_lines:
for f2 in inner_lines:
result.append(f1)
result.append(f2)
if __name__ == '__main__':
atime = time.time()
split_n = 10
with open('test.txt', 'r') as file:
line1 = file.readlines()
line2 = line1[split_n:]
line3 = line2[split_n:]
line4 = line3[split_n:]
line5 = line4[split_n:]
line6 = line5[split_n:]
line7 = line6[split_n:]
line8 = line7[split_n:]
line9 = line8[split_n:]
line10 = line9[split_n:]
p1 = Process(target=get_match, args=(line1, split_n, ))
p1.start()
p2 = Process(target=get_match, args=(line2, split_n,))
p2.start()
p3 = Process(target=get_match, args=(line3, split_n,))
p3.start()
p4 = Process(target=get_match, args=(line4, split_n,))
p4.start()
p5 = Process(target=get_match, args=(line5, split_n,))
p5.start()
p6 = Process(target=get_match, args=(line6, split_n,))
p6.start()
p7 = Process(target=get_match, args=(line7, split_n,))
p7.start()
p8 = Process(target=get_match, args=(line8, split_n,))
p8.start()
p9 = Process(target=get_match, args=(line9, split_n,))
p9.start()
p10 = Process(target=get_match, args=(line10, split_n,))
p10.start()
procs = [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10]
# complete the processes
for proc in procs:
proc.join()
btime = time.time()
print(btime-atime)
使用流程並不意味着您要進行多處理。 你的代碼的編寫方式,你只是打開一個進程,等待它返回,然后繼續打開下一個進程。 在您的第二個示例中,您執行的操作與第一個示例相同,但每次打開和關閉新進程都會增加開銷。
如果您想要實際的多處理(即所有操作同時完成),我建議您使用map
。 請參閱此處的文檔: https : //docs.python.org/2/library/multiprocessing.html
創建和銷毀進程會消耗大量資源,例如 CPU、內存和時間,如果您的數據不是那么大,則使用多進程是不好的。 我建議使用一些科學計算機軟件包,例如 numpy 和 scipy。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.