Python生成器在上三角矩阵上均匀分割(用于并行化)迭代

Python生成器在上三角矩阵上均匀分割(用于并行化)迭代,python,optimization,generator,Python,Optimization,Generator,我使用下面的代码并行地迭代矩阵的上三角部分,但我更愿意这样做,而不必实例化整个索引对集 目标是处理矩阵上三角部分的所有项目,但要并行处理。另外请注意,如果第三方库(numpy等)有一些工具可以帮助实现这一点,我可以使用它们 n_processes = 4 n = 1000 # num cols/rows in matrix pairs = [(i, j) for i, j in itertools.combinations(xrange(n), 2)] per_chunk = int(roun

我使用下面的代码并行地迭代矩阵的上三角部分,但我更愿意这样做,而不必实例化整个索引对集

目标是处理矩阵上三角部分的所有项目,但要并行处理。另外请注意,如果第三方库(numpy等)有一些工具可以帮助实现这一点,我可以使用它们

n_processes = 4
n = 1000  # num cols/rows in matrix
pairs = [(i, j) for i, j in itertools.combinations(xrange(n), 2)]
per_chunk = int(round(len(pairs) / float(n_processes)))
pair_chunks = [pairs[i*per_chunk:i*per_chunk+per_chunk] for i in xrange(n_processes)]
p = multiprocessing.Process(target=process_pairs, args=pair_chunks[0])
p = multiprocessing.Process(target=process_pairs, args=pair_chunks[1])
p = multiprocessing.Process(target=process_pairs, args=pair_chunks[2])
p = multiprocessing.Process(target=process_pairs, args=pair_chunks[3])
def process_pairs(cur_pairs):
    for i, j in pairs:
        # do some stuff

关于将其表示为生成器(即,不生成所有索引对)有什么聪明的想法吗?实际上,需要将对加载到内存中,如果n非常大,我希望避免对内存的点击。

假设,如果您不需要索引,生成器将需要直接返回值

类似地,听起来好像不想展平上部三角形,因此行向量需要保持不同

根据这些假定要求,这里是一个生成器,它生成行向量的连续切片:

>>> def generate_upper_triangular(m):
        for i, row in enumerate(m):
            yield row[i:]

>>> m = [[1, 2, 3],
         [0, 5, 6],
         [0, 0, 9]]
>>> for vec in generate_upper_triangular(m):
        print(vec)

[1, 2, 3]
[5, 6]
[9]

可能是这样(转换为Python 3):

输出:

[<itertools.islice object at 0x7f2149fbe138>, <itertools.islice object at 0x7f2149fbecc8>, <itertools.islice object at 0x7f2149fbe228>]
[[(0, 1), (0, 4), (0, 7), (1, 2), (1, 5), (1, 8), (2, 4), (2, 7), (3, 4), (3, 7), (4, 5), (4, 8), (5, 7), (6, 7), (7, 8)], [(0, 2), (0, 5), (0, 8), (1, 3), (1, 6), (1, 9), (2, 5), (2, 8), (3, 5), (3, 8), (4, 6), (4, 9), (5, 8), (6, 8), (7, 9)], [(0, 3), (0, 6), (0, 9), (1, 4), (1, 7), (2, 3), (2, 6), (2, 9), (3, 6), (3, 9), (4, 7), (5, 6), (5, 9), (6, 9), (8, 9)]]
process 0 received type <class 'itertools.islice'>
process 1 received type <class 'itertools.islice'>
process 1 processing (0, 2)
process 1 processing (0, 5)
process 1 processing (0, 8)
process 1 processing (1, 3)
process 1 processing (1, 6)
process 1 processing (1, 9)
process 1 processing (2, 5)
process 1 processing (2, 8)
process 1 processing (3, 5)
process 0 processing (0, 1)
...
输出:

[<itertools.islice object at 0x7f2149fbe138>, <itertools.islice object at 0x7f2149fbecc8>, <itertools.islice object at 0x7f2149fbe228>]
[[(0, 1), (0, 4), (0, 7), (1, 2), (1, 5), (1, 8), (2, 4), (2, 7), (3, 4), (3, 7), (4, 5), (4, 8), (5, 7), (6, 7), (7, 8)], [(0, 2), (0, 5), (0, 8), (1, 3), (1, 6), (1, 9), (2, 5), (2, 8), (3, 5), (3, 8), (4, 6), (4, 9), (5, 8), (6, 8), (7, 9)], [(0, 3), (0, 6), (0, 9), (1, 4), (1, 7), (2, 3), (2, 6), (2, 9), (3, 6), (3, 9), (4, 7), (5, 6), (5, 9), (6, 9), (8, 9)]]
process 0 received type <class 'itertools.islice'>
process 1 received type <class 'itertools.islice'>
process 1 processing (0, 2)
process 1 processing (0, 5)
process 1 processing (0, 8)
process 1 processing (1, 3)
process 1 processing (1, 6)
process 1 processing (1, 9)
process 1 processing (2, 5)
process 1 processing (2, 8)
process 1 processing (3, 5)
process 0 processing (0, 1)
...
进程0接收到的类型
流程1接收类型
进程1处理(0,2)
进程1处理(0,5)
进程1处理(0,8)
过程1处理(1,3)
过程1处理(1,6)
过程1处理(1,9)
过程1处理(2,5)
过程1处理(2,8)
过程1处理(3,5)
进程0处理(0,1)
...

请澄清您的问题,目前尚不清楚
成对块的确切含义。我更新了我的问题,进一步澄清了分块对是如何使用的。对于那些投反对票的人,希望这些更新能解决你的问题,否则请解释为什么不能。上面的代码有什么问题?@StefanPochmann——如果n非常大,会使用相当多的内存,我正试图优化内存使用。@Stefan我正试图从问题的文本中推断出他的实际需求。否则,我不清楚他/她到底想要什么。@RaymondHettinger——我更新了我的问题,以澄清结对块是如何使用的。我认为您当前的代码无法满足我的需要。如果问题/用法仍不清楚,请告知我。谢谢很好的回答,它解决了这个问题,但有一个内存问题,似乎是因为itertools的使用,如果矩阵很大,ram就会过载。我正在努力寻找确切的原因,以及如何解决它。