2

我想做这样的事情:

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 中的大循环操作?

4

1 回答 1

0

如果你想并行做一些事情......好吧,你必须并行运行它们。我认为你只看到 20% 的速度提升的原因是因为创建和加入进程的成本非常高,并且需要从多处理中获得性能优势。这种降低的速度增加是意料之中的,因为创建和加入过程会产生成本。尝试一些更耗时的事情,你会注意到 20% 上升到更“预期”的数量。

此外,如果您的瓶颈是 CPU 无法运行多个进程(现在使用双核/四核 CPU 应该不会发生),您甚至可能不会注意到速度提升,因为它们仍在以串行方式运行硬件级别。

于 2013-09-05T02:37:06.970 回答