【发布时间】: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列表,您无法控制物理分配内存的方式。 (谷歌缓存行冲突)