我想做这样的事情:
for entry in catalog:
do some operation
每个条目不一定具有相同的负载,但由于有成千上万的条目,我猜它会把它们分解成一千个或多或少的东西。 所以我想运行多个进程,每个进程用于一大块条目,以缩短我的整体运行时间。
我已尝试过以下100种内容:
from multiprocessing import Process
p1 = Process(target=myfunc, kwargs=dict(start=0, end=50))
p2 = Process(target=myfunc, kwargs=dict(start=50, end=100))
p1.start()
p2.start()
从脚本的日志记录来看,似乎两个进程确实同时运行,但与处理所有100个串行进程相比,运行时只减少了20%。 这是预期的吗?有没有更好的方法来分解python中的大循环操作?
答案 0 :(得分:0)
如果你想并行做事......那么你必须并行运行它们。我认为你之所以只看到20%的速度提升是因为创建和加入流程的成本非常高,并且咀嚼了从多处理中获得的性能优势。由于存在与创建和连接过程相关的成本,因此可以预期这种降低的速度增加。尝试更耗时的事情,你会注意到20%上升到更“预期”的数量。
另外,如果你的瓶颈是CPU无法运行多个进程(现在不应该发生双/四核cpu),你可能甚至没有注意到速度提升,因为它们仍然存在在硬件级别连续运行。