为什么多处理性能不可见?

时间:2015-04-28 13:42:41

标签: python multithreading parallel-processing multiprocessing

我看到了引用here,并尝试将该方法用于for循环,但似乎没有按预期工作。

def concatMessage(obj_grab, content):
    for logCatcher in obj_grab:
        for key in logCatcher.dic_map:
            regex = re.compile(key)
            for j in range(len(content)):
                for m in re.finditer(regex, content[j]):
                    content[j] += "           " + logCatcher.index + "        " + logCatcher.dic_map[key]
    return content

def transferConcat(args):
    return concatMessage(*args)

if __name__ == "__name__":
    pool = Pool()
    content = pool.map(transferConcat, [(obj_grab, content)])[0]
    pool.close()
    pool.join()

我想提高for循环的性能,因为它需要22秒才能运行。

当我直接运行该方法时,它也需要大约22秒。

似乎增强失败了。

如何提高循环速度? 为什么pool.map不适用于我的情况?

在nablahero提醒之后,我修改了我的代码如下:

if __name__ == "__main__":
    content = input_file(target).split("\n")
    content = manager.list(content)
    for files in source:
        obj_grab.append((LogCatcher(files), content))
    pool = Pool()
    pool.map(transferConcat, obj_grab)
    pool.close()
    pool.join()

def concatMessage(LogCatcher, content):
    for key in LogCatcher.dic_map:
        regex = re.compile(key)
        for j in range(len(content)):
            for m in re.finditer(regex, content[j]):
                content[j] += LogCatcher.index + LogCatcher.dic_map[key]

def transferConcat(args):
    return concatMessage(*args)
经过漫长的等待,它导致82秒完成...

为什么我遇到这种情况?我该如何修改我的代码?

obj_grab是一个列表,其中包含不同文件intput的logCatchers content是我要连接的文件,并使用Manager()让multiprocess连接同一个文件。

1 个答案:

答案 0 :(得分:2)

obj_grab和内容中的内容是什么?我想它只包含一个对象,所以当你启动你的游泳池时,你只需要调用一次transferConcat函数,因为你只有obj_grab和content中的一个对象。

如果您使用地图,请再次查看您的参考。 obj_grab和内容必须是对象列表才能加速你的程序,因为它使用不同的obj_grab和内容来多次调用该函数。

pool.map不会加速函数本身 - 函数只是与不同的数据并行调用多次!

我希望清除一些事情。