基于Python的多处理比顺序方法慢

时间:2018-12-11 11:55:19

标签: python python-3.x

我已经编写了一个基于python的Mulitprocessing程序来处理.csv文件。该程序打开特定文件夹中的每个.csv文件(约250个csv文件),并在每个文件中添加新行。

问题 –处理所有csv文件所需的时间比使用多处理方法的常规顺序方法要稍高。通常,多处理应该比正常的顺序处理更快。

结果 多进程所需时间:0:00:00.748690 正常时间:0:00:00.253856

您发现代码或测试方法有什么问题吗?

代码段

import multiprocessing
import csv
import datetime
import os

# Process CSV - add new row to CSV - Nomral sequential way
def process_csv_normal(param):
    for p in param:
            csv_file = p.get('workspace') + "\\" + p.get('file')
            with open(csv_file, 'a') as csvfile:
                writer = csv.writer(csvfile)
                writer.writerow({'AA001', 'AL', 'arunlal@email.com'})


# Main - Normal Process
def main_normal():
    # path of csv files  - Local machine folder path
    workspace = r"C:\Workdir\Python\csvfolder"
    params = [{'workspace': workspace, 'file': file_name} for file_name in os.listdir(workspace)
                  if file_name.endswith('.csv')]
    process_csv_normal(params)


# Process CSV - add new row to CSV
def process_csv_multiprocess(param):    
    csv_file = param.get('workspace') + "\\" + param.get('file')
    with open(csv_file, 'a') as csvfile:
         writer = csv.writer(csvfile)
         writer.writerow({'AA001', 'AL', 'arunlal@email.com'})


# Main - Multi process function
def main_multiprocess():

    # path of csv files  - Local machine folder path
    workspace = r"C:\Workdir\Python\csvfolder"

    # Number of files to process at a time
    process = 1

    params = [{'workspace': workspace, 'file': file_name} for file_name in os.listdir(workspace)
                  if file_name.endswith('.csv')]

    pool = multiprocessing.Pool(processes=process)
    pool.map_async(process_csv_multiprocess, params)
    pool.close()
    pool.join()


if __name__ == '__main__':
    start=datetime.datetime.now()
    main_multiprocess()
    print("Multiprocess Time taken: " + str(datetime.datetime.now()-start))

    start = datetime.datetime.now()
    main_normal()
    print("Normal Time Taken: " + str(datetime.datetime.now() - start))

1 个答案:

答案 0 :(得分:1)

打开文件,添加一行并关闭它是非常快速的操作,主要受磁盘访问限制(即,这不是占用大量CPU的操作)。磁盘访问通常是不可并行的(在HHD上,磁头必须移动到特定位置,在SSD上,您需要请求特定的块等),因此多处理将无济于事。

最重要的是,您需要考虑多处理引入的开销:产生进程池,序列化,传输和反序列化数据,协调等。所有这些都需要一定的成本,通常,这样做的好处是可以平衡在多个内核上并行运行的多个 CPU密集型任务,情况并非如此。