因此,我是多处理领域的新手,而且大多只是想弄清楚它。终于有了一个简单的小程序。本质上,我希望它打开一个CSV文件并将我附加到新行中。
我知道了。不过,奇怪的是,将其多处理(很多)要比根本不使用多处理要慢。
有人可以向我解释吗?
multiprocessing.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()
normal.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)
答案 0 :(得分:0)
normal.py
更快的一个原因可能是该文件不能同时被所有进程访问(如注释中所指出)。
同样重要的是,仅在必要时才使用不同的进程。例如,如果您想在100张不同的图像上运行深度学习分类器,如果使用常规方法进行操作,则需要花费时间。但是,如果您将任务划分为两个进程,则会注意到加速。
因此,我认为您仅应在希望它们进行一些繁重的处理时才使用它们(现在,您仅在单个文件中进行写入)。因为每次使用multiprocessing.Process
时,它都会产生(创建过程控制块,新过程继承资源,为其状态保留内存,少一些开销),并且产生一个新的过程是一个缓慢的过程。
如果您真的想比较两者的性能,则可以制作单独的文件并在循环内进行一些计算。
normal.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)
multiprocessing.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()
检查这些文件,并根据需要增加范围