Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中优化计算速度:多处理还是不?_Python_Optimization_Multiprocessing - Fatal编程技术网

在python中优化计算速度:多处理还是不?

在python中优化计算速度:多处理还是不?,python,optimization,multiprocessing,Python,Optimization,Multiprocessing,我试图用python 3.6计算从一个圆柱体到另一个圆柱体的引力。为此,我将每个圆柱体划分为点质量,然后计算圆柱体1中每个点质量对圆柱体2中每个点质量的作用力。当然,我想使这些点质量尽可能小,但是计算的数量增加得非常快。因此,我试图优化我的代码。 看起来像这样 class Mass: def calcForceFrom(self, p_mass): F_total = np.array([0.0, 0.0, 0.0]) for i, element in

我试图用python 3.6计算从一个圆柱体到另一个圆柱体的引力。为此,我将每个圆柱体划分为点质量,然后计算圆柱体1中每个点质量对圆柱体2中每个点质量的作用力。当然,我想使这些点质量尽可能小,但是计算的数量增加得非常快。因此,我试图优化我的代码。 看起来像这样

class Mass:
    def calcForceFrom(self, p_mass):
        F_total = np.array([0.0, 0.0, 0.0])
        for i, element in enumerate(self.elements):
            p_mass.calcForceOn(element)
            F_total = F_total + element.sum_of_forces

        return F_total

    def calcForceOn(self, p_target):
        # calculates the force from this Mass on some point mass
        for element in self.elements:
            p_target.addForce(Mass.F(p_target, element))

    @staticmethod
    def F(p_target, p_element):
        # difference vector
        r = p_element.x - p_target.x

        # calculate length^3/2
        rr = (r.dot(r))**(3/2)

        return p_element.m * p_target.m / rr * r

F_12 = cyl1.calcForceFrom(cyl2)
我已经使用了cProfiler,函数F被调用的次数最多,占用的时间最多。我对它做了一些改进,现在我认为没有更多的收获

所以接下来我想我可以使用多线程同时计算多个元素上的力。然而,这毫无帮助。以下是我尝试过的:

from multiprocessing.dummy import Pool as ThreadPool 

class Mass:
    def __init__(self):
        self.pool = ThreadPool(4)

    def calcForceFrom(self, p_mass):
        forces = self.pool.map(p_mass.calcForceOn, self.elements)
        F_total = sum(forces)
使用这种方法,计算时间增加了一倍以上。我认为让这些计算并行运行会提高速度。显然我错了

那么,为什么这不起作用呢?我应该为哪些用例使用多处理?还有什么其他方法可以提高我的计算速度


顺便说一句:利用问题中的对称性来减少我需要计算的点数已经在我的待办事项清单上了。

你(仔细)阅读了文档吗?我不太熟悉python的多处理(但至少使用过一次替代包装器joblib),我强烈认为pool.map正在为每个进程复制/序列化数据(这可能会很昂贵)。
(r.dot(r))**(3/2)
我已经看到,与数学库相比,python的求幂速度非常慢。。。在这种情况下,可能不会太多,但如果F最常被调用,它可能值得研究。至于螺纹部分,您确定有4个芯可用吗?在VM中,大多数情况下都会出现问题。提示出现在模块名
多处理中。dummy
-它只是通过线程接口模拟多处理,而Python线程由于可怕的GIL而不会并行执行。事实上,正如您所注意到的,它只会使代码运行变慢。我们在这里讨论的数据量是多少?您希望每次运行多少次计算?如果您确实需要高性能,可以用C重写关键部分。同一时间只运行一个线程,这允许并发处理,但不允许并行处理(这主要是协作式多任务处理,虽然也有一些抢占式多任务处理,但无论如何,一次只能运行一个线程。)
多处理模块允许在单独的内核上进行真正的并行处理,但涉及大量开销(包括子进程的生成,每个子进程都有自己的Python解释器)。请看。底线是,我认为这两种方法都没有帮助。