Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么多处理性能是不可见的?_Python_Multithreading_Parallel Processing_Multiprocessing - Fatal编程技术网

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

Python 为什么多处理性能是不可见的?,python,multithreading,parallel-processing,multiprocessing,Python,Multithreading,Parallel Processing,Multiprocessing,我看到了引用,并尝试使用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.fi

我看到了引用,并尝试使用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秒

看来增强失败了

我应该做些什么来提高我的for-loop速度? 为什么在我的情况下,
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是一个列表,其中包含不同文件输入的日志捕捉器
内容是我要处理的文件,使用Manager()可以让多进程处理同一个文件。

obj_抓取和内容中有什么?我猜它只包含一个对象,所以当您启动池时,只调用函数transferConcat一次,因为在obj_grab和content中只有一个对象

如果您使用地图,请再次查看您的参考资料。obj_抓取和内容必须是对象列表,以加快程序的速度,因为它使用不同的obj_抓取和内容多次调用函数

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


我希望这能澄清一些问题。

你说的“性能是无形的”是什么意思?什么样的性能是可见的?不相关的,但您可以迭代内容而不是索引。此示例代码将比等效的顺序代码慢。您所做的只是在子进程中运行单个函数,并等待它完成。IPC将函数及其参数发送到子进程的成本会使它比只在父进程中运行要慢
Pool.map
仅当您使用它并行运行多个函数时才有用。