我看到了引用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连接同一个文件。
答案 0 :(得分:2)
obj_grab和内容中的内容是什么?我想它只包含一个对象,所以当你启动你的游泳池时,你只需要调用一次transferConcat函数,因为你只有obj_grab和content中的一个对象。
如果您使用地图,请再次查看您的参考。 obj_grab和内容必须是对象列表才能加速你的程序,因为它使用不同的obj_grab和内容来多次调用该函数。
pool.map不会加速函数本身 - 函数只是与不同的数据并行调用多次!
我希望清除一些事情。