使用Python中的多处理模块提高速度

时间:2014-03-20 19:44:09

标签: python multiprocessing

我正在使用此示例在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

2 个答案:

答案 0 :(得分:3)

Python没有神奇地使你的代码并行运行的工具。

你在这里做的是一个由4个进程组成的池,并给它一个任务,它将在一个进程中运行。

进程/线程池用于并行运行大量任务(最多4个,或者一次指定的任何内容)。
将任务分成许多子任务是程序员的责任。

答案 1 :(得分:1)

I / O密集型任务可以通过使它们更加并行来减慢。机械硬盘尤其如此。

想象一下,你能够将文件分成4个部分并运行4个进程,这些进程会导致驱动器寻找的内容不仅仅是按顺序读取文件。

如果4个文件中有4个工作人员,则会出现同样的情况,但您不必考虑如何拆分文件。

如果len是一项耗时的操作,您可能会通过逐行读取文件顺序来看到性能提升,并让工作人员从Queue中提取这些行。但是,除非你有非常快的存储空间(可能是文件被缓存),否则它不会产生太大的影响。