Python问题中的多重处理

2024-03-28 13:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我对多重处理还比较陌生,主要是想弄清楚。终于有了一个简单的小程序。本质上,我希望它打开一个CSV文件并将I附加到一个新行

我成功了。奇怪的是,多处理比不使用多处理要慢得多

有人能给我解释一下吗

多处理.py

import csv
import multiprocessing

def wrtCSV(i):
    with open('test.csv', 'a') as newFile:
        newFileWriter = csv.writer(newFile)
        newFileWriter.writerow([str(i)])

if __name__ == '__main__':
    jobs = []
    for i in range(100000):
        p  = multiprocessing.Process(target=wrtCSV, args=(i,))
        jobs.append(p)
        p.start()

正常.py

import csv

def wrtCSV(i):
    with open('test.csv', 'a') as newFile:
        newFileWriter = csv.writer(newFile)
        newFileWriter.writerow([str(i)])

if __name__ == '__main__':
    for i in range(100000):
        wrtCSV(i)

Tags: csvpytestimportdefaswithopen
1条回答
网友
1楼 · 发布于 2024-03-28 13:55:02

normal.py更快的一个原因可能是文件不能被所有进程同时访问(如注释中所指出的)

只有在必要的时候才使用不同的流程也是很重要的。例如,如果您想在100个不同的图像上运行深度学习分类器,如果您使用常规方法,则需要时间。但是如果你在进程之间划分任务,你会注意到加速

因此,我认为只有当您希望流程执行一些繁重的处理时才应该使用流程(现在您只是在单个文件中编写)。因为每次使用multiprocessing.Process时,它都会生成一个新进程(创建进程控制块,新进程继承资源,为其状态保留内存,几乎没有额外的开销),而生成进程是一个缓慢的过程

如果您真的想比较两者的性能,可以制作单独的文件并在循环中进行一些计算

正常.py

import csv

def wrtCSV(i):
    for j in range(100):
        if (j**2 * j + i * (j-j) + (j*i) + 1): # lets do some redundant calculations for benchmarking
            with open('test{}{}.csv'.format(i,j), 'a') as newFile: # make individual files so that OS doesn't lock them
                newFileWriter = csv.writer(newFile)
                newFileWriter.writerow([str(i)])

if __name__ == '__main__':
    for i in range(100):
        wrtCSV(i)

多处理.py

import csv
import multiprocessing

def wrtCSV(i):
    for j in range(100):
        if (j**2 * j + i * (j-j) + (j*i) + 1): # lets do some redundant calculations for benchmarking
            with open('test{}{}.csv'.format(j,i), 'a') as newFile: # make individual files so that OS doesn't lock them
                newFileWriter = csv.writer(newFile)
                newFileWriter.writerow([str(i)])

if __name__ == '__main__':
    jobs = []
    for i in range(100):
        p  = multiprocessing.Process(target=wrtCSV, args=(i,))
        jobs.append(p)
        p.start()

检查这些文件,如果需要,还可以增加范围

相关问题 更多 >