我正在使用此示例在Python中测试多处理模块。它计算语料库中每个单词的长度。
from multiprocessing import Pool
def open_file(file):
with open(file) as f:
f = f.read()
return f
def split_words(file):
f = open_file(file)
return [[len(i), i] for i in f.split()]
def split_mult(file):
#uses the multiprocessing module
pool = Pool(processes = 4)
work = pool.apply_async(split_words, [file])
return work.get()
print split_words("random.txt") - about 90seconds for a 110K file
print split_mult("random.txt") - about 90seconds for a 110K file
* split_mult *函数使用多处理而* split_words *不使用。我的印象是,我会看到使用多处理模块的处理时间更快,但运行时几乎没有差别。我运行每个函数大约5次。有什么我想念的吗?
更新
我重写了代码,更好地理解了多处理,并且能够将处理时间缩短到~12秒!这是快速而又脏的代码,但希望对试图理解这个概念的其他人有所帮助 - https://github.com/surajkapoor/MultiProcessing-Test/blob/master/multi.py
答案 0 :(得分:3)
Python没有神奇地使你的代码并行运行的工具。
你在这里做的是一个由4个进程组成的池,并给它一个任务,它将在一个进程中运行。
进程/线程池用于并行运行大量任务(最多4个,或者一次指定的任何内容)。
将任务分成许多子任务是程序员的责任。
答案 1 :(得分:1)
I / O密集型任务可以通过使它们更加并行来减慢。机械硬盘尤其如此。
想象一下,你能够将文件分成4个部分并运行4个进程,这些进程会导致驱动器寻找的内容不仅仅是按顺序读取文件。
如果4个文件中有4个工作人员,则会出现同样的情况,但您不必考虑如何拆分文件。
如果len
是一项耗时的操作,您可能会通过逐行读取文件顺序来看到性能提升,并让工作人员从Queue
中提取这些行。但是,除非你有非常快的存储空间(可能是文件被缓存),否则它不会产生太大的影响。