【发布时间】:2016-12-18 12:44:34
【问题描述】:
我正在尝试了解 Python 的多处理,并设计了以下代码来测试它:
import multiprocessing
def F(n):
if n == 0: return 0
elif n == 1: return 1
else: return F(n-1)+F(n-2)
def G(n):
print(f'Fibbonacci of {n}: {F(n)}')
processes = []
for i in range(25, 35):
processes.append(multiprocessing.Process(target=G, args=(i, )))
for pro in processes:
pro.start()
当我运行它时,我告诉我计算时间大约是 6.65s。
然后我写了下面的代码,我认为在功能上和后者是等价的:
from multiprocessing.dummy import Pool as ThreadPool
def F(n):
if n == 0: return 0
elif n == 1: return 1
else: return F(n-1)+F(n-2)
def G(n):
print(f'Fibbonacci of {n}: {F(n)}')
in_data = [i for i in range(25, 35)]
pool = ThreadPool(10)
results = pool.map(G, in_data)
pool.close()
pool.join()
它的运行时间几乎是 12 秒。
为什么第二个几乎是第一个的两倍?他们不应该是等价的吗?
(注意。我正在运行 Python 3.6,但也在 3.52 上测试了类似的代码,结果相同。)
【问题讨论】:
-
你是怎么
join第一个版本的? -
我没有。我应该有吗?
-
您如何知道已完成的流程?据我记得,start 不会告诉您该过程何时完成,所以我假设在您显示的内容之后有一些代码。
-
好吧,没有更多代码了。由于 G(F()) 函数按要求执行,我认为没有任何问题。
-
确实,如果我在第一版代码的最后一个for循环中添加
pro.join,运行时间就会重复。
标签: python-3.x python-multiprocessing