簡體   English   中英

Python 讀取文件時使用多進程太慢

[英]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.

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