gpt4 book ai didi

Python多处理比单线程慢

转载 作者:行者123 更新时间:2023-11-28 21:09:31 24 4
gpt4 key购买 nike

我一直在研究多处理问题,并注意到我的算法在并行化时比在单线程时慢。

在我的代码中,我不共享内存。而且我很确定我的算法(见代码),它只是嵌套循环,是 CPU 绑定(bind)的。

但是,无论我做什么。并行代码在我所有的计算机上运行速度慢 10-20%。

我还在 20 个 CPU 的虚拟机上运行了这个,单线程每次都比多线程好(实际上比我的电脑还慢)。

from multiprocessing.dummy import Pool as ThreadPool
from multi import chunks
from random import random
import logging
import time
from multi import chunks

## Product two set of stuff we can iterate over
S = []
for x in range(100000):
S.append({'value': x*random()})
H =[]
for x in range(255):
H.append({'value': x*random()})

# the function for each thread
# just nested iteration
def doStuff(HH):
R =[]
for k in HH['S']:
for h in HH['H']:
R.append(k['value'] * h['value'])
return R

# we will split the work
# between the worker thread and give it
# 5 item each to iterate over the big list
HChunks = chunks(H, 5)
XChunks = []

# turn them into dictionary, so i can pass in both
# S and H list
# Note: I do this because I'm not sure if I use the global
# S, will it spend too much time on cache synchronizatio or not
# the idea is that I dont want each thread to share anything.
for x in HChunks:
XChunks.append({'H': x, 'S': S})

print("Process")
t0 = time.time()
pool = ThreadPool(4)
R = pool.map(doStuff, XChunks)
pool.close()
pool.join()

t1 = time.time()

# measured time for 4 threads is slower
# than when i have this code just do
# doStuff(..) in non-parallel way
# Why!?

total = t1-t0
print("Took", total, "secs")

有许多相关问题已打开,但很多都是针对代码结构不正确的——每个 worker 都受 IO 限制等。

最佳答案

您正在使用多线程,而不是多处理。虽然许多语言允许线程并行运行,但 Python 不允许。线程只是一个单独的控制状态,即它拥有自己的堆栈、当前函数等。python 解释器只是不时地在执行每个堆栈之间切换。

基本上,所有线程都在单个内核上运行。它们只会在您不受 CPU 限制时加速您的程序。

multiprocessing.dummy replicates the API of multiprocessing but is no more than a wrapper around the threading module.

如果您受 CPU 限制,多线程通常比单线程慢。这是因为工作和处理资源保持不变,但是您增加了管理线程的开销,例如在它们之间切换。

如何解决这个问题:不要使用 from multiprocessing.dummy import Pool as ThreadPool 而是使用 multiprocessing.Pool as ThreadPool


您可能想阅读 GIL,即全局解释器锁。这就是阻止线程并行运行的原因(以及对单线程性能的影响)。 CPython 以外的 Python 解释器可能没有 GIL,并且能够在多个内核上运行多线程。

关于Python多处理比单线程慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38217449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com