Как создать частичный список из iterator.combination ()? - PullRequest
0 голосов
/ 16 июня 2019

Мне нужен список всех комбинаций длины t для некоторых вычислений на GPU. Я использовал X=itertools.combinations(range(n),t) для создания итератора. Мне нужно передать все комбинации в GPU одновременно, поэтому я использую list(X) для генерации всех комбинаций из итератора.

Для более высоких значений n и t мне не хватает памяти. Есть ли способ создать несколько небольших списков всех комбинаций, которые могут поместиться в памяти по одному? Например, если у меня есть n=25 и t=12, вместо генерации всех комбинаций 25 choose 12, могу ли я получить список комбинаций 10,000 одновременно, которые я могу обработать на графическом процессоре?

1 Ответ

0 голосов
/ 16 июня 2019
from itertools import combinations, count, takewhile

n=25
t=12

chunk_size = 10000

x = combinations(range(n),t)

i = 0
while True:
    l = [*takewhile(lambda _, c=count(): next(c) < chunk_size, x)]

    # your code here, l is a list of length max. 10000 of combinations
    print(l)

    i += 1

    if len(l) < chunk_size:
        break

print('We have done {} iterations.'.format(i))

Отпечатки:

[(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 16), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 17), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19), ...

И в конце:

We have done 520 iterations.
...