【问题标题】:Calculate distance between every pair of points in 2D using parallel processing使用并行处理计算 2D 中每对点之间的距离
【发布时间】:2020-08-11 21:50:00
【问题描述】:

在我的问题中,二维空间中有多组点。
即)第1组10分,第2组10分,第3组10分。

我需要计算每组中点之间的所有距离。 即)

距离(1,2,1,1):组1中的点1与组2中的点1之间的距离

距离(1,2,1,2):组1中的点1与组2中的点2之间的距离

距离(1,2,1,3):组1中的点1和组2中的点3之间的距离

....

distance(2,3,10,10):第2组点10到第3组点10的距离

距离涵盖所有组中的所有点。
目前,我使用了如下 4-4 个循环,但耗时太长。

distt = [[] for i in range(ball_number)]
for m in range(group_number-1):
    for n in range(m+1, group_number):
        for i in range(ball_number):
            for j in range(ball_number):
                    distt[i].insert(j, distance between point[i] and point[j])

一个人建议我......“使用多个线程(组的相同数量)和类,并用一个线程计算单个组的所有距离”但我不知道该怎么做。

有人可以帮助我使用多线程的快速计算方法或任何建议吗?

【问题讨论】:

  • 在多线程之前,我会先尝试 numpy,然后再尝试 numpy 和 numba 。这是 numba 有很大帮助的那种东西。关于堆栈溢出的话题有很多讨论,例如:stackoverflow.com/questions/56126913/…。同样,在一个线程很快之后,如果速度增益不够,您可以随时查看多线程。
  • 多线程实际上会使其更快吗?在this question 中提到了 CPython 的全局解释器锁,以及在 CPU 密集型任务中使用多线程不会提高性能。相反,建议使用多个进程。

标签: python multithreading loops concurrency distance


【解决方案1】:

假设只有 3 组点,你可以创建 3 个进程。

这 3 个过程将分别计算集合 (1,2)、(2,3) 和 (1,3) 之间的每对点之间的距离。

一般来说,如果有n 集合,那么我们可以生成一个带有min(num_processor, n*(n-1) / 2) 子进程的进程池以获得最大的并行度,其中num_processor 是计算机中的物理内核数。

并不是说我们需要多处理而不是多线程,因为这是一个 CPU 绑定操作而不是 IO 绑定操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多