Python多处理比顺序慢

时间:2017-10-25 14:11:30

标签: python multiprocessing python-multiprocessing

首先,我知道有大约20个类似标题的问题,我保证我已经阅读了所有这些问题。

我知道Python多处理的大多数缺点,而且我并不期望大量加速应用它。这是我第一次使用multiprocessing.Process,过去我总是使用Pool。我认为我做错了,因为它运行速度要慢几个数量级。顺序方法的一次迭代在不到一秒的时间内运行,而并行方法的一次迭代运行时间超过一分钟。

对于上下文,这是一个n体模拟器,这种特殊的方法是检查碰撞并更新作用在每个物体上的力。我知道有更好的方法可以做到这一点,这只是为了我的学习。

以下是代码:

from multiprocessing import Process, Manager


def par_run_helper(self, part, destroy, add):
    for other in self.parts:
        if other not in destroy and other is not part:
            if part.touches(other):
                add.append(part + other)
                destroy.append(other)
                destroy.append(part)
                self.touches += 1
                print("TOUCH " + str(part.size + other.size))
            else:
                part.interact(other, self.g)

def par_run(self, numTicks=1, visualizeEvery=1, visualizeAfter=0):
    manager = Manager()
    destroy = manager.list()
    add = manager.list()
    for tick in range(numTicks):
        print(tick)
        processes = []
        for part in self.parts:
            print(part)
            p = Process(target=self.par_run_helper, args=(part, destroy, add))
            p.start()
            processes.append(p)
        for p in processes:
            p.join()

        for p in destroy:
            try:
                self.parts.remove(p)
            except Exception:
                pass
        for p in add:
            self.parts.append(p)

每次迭代都需要大约相同的时间,因为它们都在相同数量的元素上运行。

经理是multiprocessing.Manager()part是粒子的缩写,是我目前正在更新的粒子。 destroyadd是将在刻度结束时销毁并添加的粒子列表。 我测试的只有300个零件,但我希望能够做到1000个。

0 个答案:

没有答案