Python,多处理:如何优化代码?让代码更快?

Python,多处理:如何优化代码?让代码更快?,python,file,multiprocessing,python-multithreading,zipfile,Python,File,Multiprocessing,Python Multithreading,Zipfile,我使用Python。我有100个压缩文件。每个zipfile包含100多个XML文件。我使用xmlfiles创建csvfiles from xml.etree.ElementTree import fromstring import zipfile from multiprocessing import Process def parse_xml_for_csv1(data, writer1): root = fromstring(data) for node in root.

我使用Python。我有100个压缩文件。每个zipfile包含100多个XML文件。我使用xmlfiles创建csvfiles

from xml.etree.ElementTree import fromstring
import zipfile
from multiprocessing import Process

def parse_xml_for_csv1(data, writer1):
    root = fromstring(data)
    for node in root.iter('name'):
        writer1.writerow(node.get('value'))

def create_csv1():
    with open('output1.csv', 'w') as f1:
        writer1 = csv.writer(f1)

        for i in range(1, 100):
            z = zipfile.ZipFile('xml' + str(i) + '.zip')
            # z.namelist() contains more than 100 xml files
            for finfo in z.namelist():
                data = z.read(finfo) 
                parse_xml_for_csv1(data, writer1)


def create_csv2():
    with open('output2.csv', 'w') as f2:
        writer2 = csv.writer(f2)

        for i in range(1, 100): 
            ...


if __name__ == "__main__":
    p1 = Process(target=create_csv1)
    p2 = Process(target=create_csv2)
    p1.start()
    p2.start()
    p1.join()
    p2.join()

请告诉我,如何优化我的代码?使代码更快?

您只需要定义一个带有参数的方法。 在给定数量的线程或进程之间拆分100.zip文件的处理。添加的进程越多,使用的CPU就越多,而且可能可以使用两个以上的进程,速度也会更快(在某些情况下可能会因为磁盘I/O而出现瓶颈)

在下面的代码中,我可以更改为4或10个进程,无需复制/粘贴代码。它处理不同的zip文件

您的代码并行处理相同的100个文件两次:甚至比没有多处理时还要慢

def create_csv(start_index,step):
    with open('output{0}.csv'.format(start_index//step), 'w') as f1:
        writer1 = csv.writer(f1)

        for i in range(start_index, start_index+step):
            z = zipfile.ZipFile('xml' + str(i) + '.zip')
            # z.namelist() contains more than 100 xml files
            for finfo in z.namelist():
                data = z.read(finfo)
                parse_xml_for_csv1(data, writer1)



if __name__ == "__main__":
    nb_files = 100
    nb_processes = 2   # raise to 4 or 8 depending on your machine

    step = nb_files//nb_processes
    lp = []
    for start_index in range(1,nb_files,step):
        p = Process(target=create_csv,args=[start_index,step])
        p.start()
        lp.append(p)
    for p in lp:
        p.join()

您只需要定义一个带有参数的方法。 在给定数量的线程或进程之间拆分100.zip文件的处理。添加的进程越多,使用的CPU就越多,而且可能可以使用两个以上的进程,速度也会更快(在某些情况下可能会因为磁盘I/O而出现瓶颈)

在下面的代码中,我可以更改为4或10个进程,无需复制/粘贴代码。它处理不同的zip文件

您的代码并行处理相同的100个文件两次:甚至比没有多处理时还要慢

def create_csv(start_index,step):
    with open('output{0}.csv'.format(start_index//step), 'w') as f1:
        writer1 = csv.writer(f1)

        for i in range(start_index, start_index+step):
            z = zipfile.ZipFile('xml' + str(i) + '.zip')
            # z.namelist() contains more than 100 xml files
            for finfo in z.namelist():
                data = z.read(finfo)
                parse_xml_for_csv1(data, writer1)



if __name__ == "__main__":
    nb_files = 100
    nb_processes = 2   # raise to 4 or 8 depending on your machine

    step = nb_files//nb_processes
    lp = []
    for start_index in range(1,nb_files,step):
        p = Process(target=create_csv,args=[start_index,step])
        p.start()
        lp.append(p)
    for p in lp:
        p.join()

每个未压缩的xml文件有多大?您正在编写的CSV呢?goncalopp,xml文件很小(大约10行)。我只需要2个csv文件。我会使用lxml来处理,并在c级别尽可能多地处理。每个未压缩的xml文件有多大?您正在编写的CSV呢?goncalopp,xml文件很小(大约10行)。我只需要2个csv文件。我会使用lxml进行处理,并在c级别尽可能多地进行处理。很好,但是为什么要使用
进程
而不是
?a
多处理。池
是的,但鉴于进程数较少,这里不需要它。很好,但是为什么一个
进程
而不是
?一个
多处理。池
是的,但是考虑到进程数量较少,这里不需要它。