在Python中使用多进程提高执行效率

5

我有 4 个 Python 列表,每个列表都包含一个内部列表,其中包含 2 个项目:

a = [[1,2], [3,4], ...]
b = [[5,2], [2,4], ...]
c = [[7,2], [5,4], ...]
d = [[8,2], [4,4], ...]

我可以像这样连续地汇总内部列表:

for list in [a,b,c,d]:
    total = 0
    for [x,y] in list:
        total += x + y
    print("total is: ", total)

假设每个列表的求和操作都需要5秒钟,所以连续对4个列表求和需要20秒钟。
如果我使用multiprocessing,我能并发地对4个列表求和,所有4个求和操作只需要5秒钟,而不是20秒吗?

2
不,多进程涉及相当大的开销。 - gmds
1
假设计算纯粹是CPU密集型的,并且您有额外的处理能力/核心来处理它。几乎是这样,是的。但通常情况下会更加复杂,任何I/O绑定都通常最好使用线程或asyncio。 - CasualDemon
你需要将工作分成几个并行函数,例如 def func: sum=a[i]+b[i]+c[i]+d[i]。然后使用 multiprocessing pool 进行处理。 https://docs.python.org/3.4/library/multiprocessing.html?highlight=process 请参阅 17.2.1.6. 使用工作池。 - Nic Wanavit
由于您不修改由单独核心观察到的内存,因此这应该看到几乎线性的加速(忽略其他进程启动时由IPC和C施加的影响)。另一件事是Python列表,您无法控制内存如何在物理上分配。(Google高速缓存行冲突) - rAndom69
多进程编程 = 在Python中使用多个进程。这里不适用GIL(全局解释器锁)。 - rAndom69
显示剩余3条评论
1个回答

0

是的,对于纯CPU工作,它会以线性方式加速。快速示例:

from multiprocessing import Pool
import time


def calc_total(*_):
    sum(range(100_000_000))


start_time_1 = time.time()
for _ in range(4):
    calc_total()
print(time.time() - start_time_1)

with Pool(processes=4) as p:
    start_time_2 = time.time()
    p.map(calc_total, range(4))
    print(time.time() - start_time_2)

单线程:4.127秒

多线程:0.960秒

然而,您在示例中可能会遇到的问题是管理内存中的数组以便共享或为每个线程创建,否则在进程之间移动数组会产生大量开销,从而降低速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接