在测试过程中,我在下面发现,MP方法运行得有点慢
def eat_time(j):
result = []
for j in range(10**4):
a = 0
for i in range(1000):
a += 101
result.append(a)
return result
if __name__ == '__main__':
#MP method
t = time.time()
pool = Pool()
result = []
data = pool.map(eat_time, [i for i in range(5)])
for d in data:
result += d
print(time.time()-t) #11s for my computer
#Normal method
t = time.time()
integers = []
for i in range(5):
integers += eat_time(i)
print(time.time()-t) #8s for my computer
但是,如果我不需要它通过将eat_time()
更改为
def eat_time(j):
result = []
for j in range(10**4):
a = 0
for i in range(1000):
a += 101
#result.append(a)
return result
MP时间要快得多,现在我的电脑只运行3s,而正常方法仍然需要8s。(不出所料(
这对我来说看起来很奇怪,因为result
是在method
中单独声明的,我不希望附加完全破坏 MP。
我可以知道有没有正确的方法可以做到这一点?为什么 MP 在涉及追加时速度较慢?
已编辑以征求意见
感谢@torek,@akhavro澄清这一点。
是的,我知道创建过程需要时间,这就是提出问题的原因。
实际上,原始代码将for循环放在外面并一次又一次地调用简单方法,在很多任务中,它比普通方法快一点(我的情况超过10**6次调用(。
因此,我更改为将代码放入其中并使方法更加复杂。通过将for j in range(10**4):
这条线移动到eat_time()
.
但是,由于数据量较大,似乎使代码复杂会导致通信滞后。
所以,答案可能是没有办法解决它。
不是追加会导致您的缓慢,而是返回带有附加元素的结果。您可以通过更改代码以执行追加来测试它,但仅返回结果的前几个元素。 现在它应该再次更快地工作。
当您从Pool
工作线程返回结果时,这实际上是作为多处理队列实现的。它有效,但它不是一个奇迹表演者,绝对比仅仅操纵内存结构要慢得多。当你返回大量数据时,队列需要传输大量数据。
没有简单的解决方法。您可以尝试共享内存,但由于复杂性增加,我个人不喜欢它。更好的方法是重新设计您的应用程序,以便它不需要在进程之间传输大量数据。例如,是否可以进一步处理工作线程中的数据,以便您不需要返回所有数据,而只需要返回已处理的子集?