使用Python的多进程模块提高速度

2 投票
2 回答
1487 浏览
提问于 2025-04-17 23:11

我正在用一个例子测试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 个回答

1

输入输出密集型的任务可以通过让它们更并行来加快速度。这在使用机械硬盘的时候尤其明显。

想象一下,如果你能把一个文件分成4个部分,然后同时运行4个进程,这样会让硬盘在读取文件时需要频繁移动,而不是一次性顺序读取整个文件。

如果你有4个工人在处理4个文件,情况也是一样的,这样你就不需要考虑如何分割文件了。

如果len这个操作很耗时间,你可能会发现通过逐行顺序读取文件,并让工人从Queue中提取这些行,可以提高性能。不过,除非你的存储速度非常快(比如文件已经被缓存),否则这种方法不会有太大区别。

3

Python并没有神奇的功能可以让你的代码自动并行运行。

你在这里做的是创建了一个包含4个进程的池子,然后给它分配了一个任务,这个任务只会在一个进程中运行。

进程/线程池是用来同时运行很多任务的(最多4个,或者你指定的数量)。
把一个任务拆分成多个子任务是程序员自己的责任。

撰写回答