均匀地在线程中切片嵌套循环的公式是什么?

时间:2019-02-07 13:01:47

标签: python multithreading loops nested complexity-theory

具有一个数据集,其中每一行都需要与其他每一行结合应用加权函数(交叉连接)。是否应用该功能取决于两行中的数据,因此我不能只使用数据库。

因此,一个解决方案是在python中实现的。为了提高性能,应使用线程。

现在的问题是,在均匀分布的迭代中拆分数据集的公式是什么,所以每个线程几乎都有相同的工作。

下面是该代码的简化版本。

l = 250000  # number of rows
N = 8       # number of threads
for threadid in range(N):
    kstart = ### WHAT IS THE FORMULA TO GIVE EACH THREAD THE SAME WORK
             ### i.e. the starting index of the next thread begins after the last row of the previous thread
    klen =
    # Start thread here
    #threading.Tread(..., (kstart,klen))

def _threaded(kstart, klen):
    for k1 in range(kstart, klen):
        for k2 in range(k1, l - k1):
            # DoSomething(k1, k2)
            pass

示例:

上面显示的循环导致以下迭代:

k1     | k2
0      | 0 to 249999 = 250000 iterations in inner loop
1      | 1 to 249999 = 249999 iterations in inner loop
2      | 2 to 249999 = 249998 iterations in inner loop
...
249999 | 249999 = 1 iteration in inner loop
  • kstart的简单版本可以是:'l // N * threadid'-将整个集合散布成均匀分布的组。

线程1:0-31249

线程2:31250-62499

...

线程8:218750-249999

  • 现在,让k1在kstart上循环直到下一批的kstart。
  • 现在的问题是,对于小k1,k2必须做很多工作。对于大k1,功几乎为零。

如何更好地将k1的批次切成薄片?

线程1:0-10

线程2:11-100

线程3:101-500

线程8:128000-250000

(这是一个示例,数字不正确)

0 个答案:

没有答案