【问题标题】:Multiprocessing to speed up execution time in python多处理以加快python中的执行时间
【发布时间】:2019-10-02 01:18:57
【问题描述】:

我有 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 秒吗?

【问题讨论】:

  • 不,多处理涉及大量开销。
  • 假设计算完全受 CPU 限制,并且您有额外的处理能力/内核来处理它。几乎如此,是的。然而,这通常会更加模糊,任何 I/O 绑定通常都会使用线程或异步更好。
  • @CasualDemon 在这个例子中是否有任何 I/O 绑定?所有 4 个列表都在内存中,并且在运行期间与外部世界没有任何连接(让我们省略那里的打印功能)。
  • 你必须把工作分成几个并行的函数。比如 def func: sum=a[i]+b[i]+c[i]+d[i]。然后多处理池应该可以工作。 docs.python.org/3.4/library/… 见 17.2.1.6。使用工人池
  • 当您修改由单独内核观察到的内存时,这应该会看到几乎线性加速(忽略其他进程启动所施加的 IPC 和 C )。另一件事是python列表,您无法控制物理分配内存的方式。 (谷歌缓存行冲突)

标签: python multiprocessing


【解决方案1】:

是的,对于纯 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 秒

但是,您在示例中遇到的问题是管理内存中要共享或创建的每个线程的数组,否则在进程之间移动数组会产生大量开销,这会减慢速度。

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 2015-04-11
    • 2021-01-06
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多