我正在使用concurrent.futures.ThreadPoolExecutor进行实验,看看能否从我的四核处理器(具有8个逻辑核)中挤出更多的工作。因此,我编写了以下代码:
from concurrent import futures
def square(n):
return n**2
def threadWorker(t):
n, d = t
if n not in d:
d[n] = square(n)
def master(n, numthreads):
d = {}
with futures.ThreadPoolExecutor(max_workers=numthreads) as e:
for i in e.map(threadWorker, ((i, d) for i in range(n))):
pass # done so that it actually fetches each result. threadWorker has its own side-effects on d
return len(d)
if __name__ == "__main__":
print('starting')
print(master(10**6, 6))
print('done')
有趣的是,同样的功能,用for循环写出来只需要约一秒钟的时间:
>>> d = {}
>>> for i in range(10**6):
... if i not in d: d[i] = i**2
虽然线程池代码需要超过10秒,但是我知道它至少使用了4个线程,因为我看到每个内核的处理器负载。但是即使有共享内存(我可以理解进程可能需要一段时间,由于内存复制),我觉得运行时差异太大了。
有人有什么想法,为什么会需要这么长时间吗?似乎一个简单的平方操作,确实高度可并行化,不应该花费这么长时间。也许这是由于字典的填充导致的(如果是这样,那是什么导致了减速呢?)?
技术细节:
- Python 3.3.3
- 四核(8个逻辑核心带超线程)CPU
- MAC OSX 10.9.1(Mavericks)
dict
,只需让每个人返回一个dict
。或者类似的东西。 - roippi