Допустим, у меня есть список элементов [1, 2, 3, 4]
. Я генерирую список всех возможных комбинаций этих чисел:
from itertools import combinations
import random
import numpy as np
def returnCombinations(input_list, comb_size):
return list(combinations(arr, r))
def batchCombinations(input_list):
# generate the complete list
N = len(input_list)
complete_list = []
for idx in range(1, N+1):
complete_list += list(combinations(input_list, idx))
return complete_list
arr = [1, 2, 3, 4]
data_list = batchCombinations(arr)
и получаю следующий список:
[(1,),
(2,),
(3,),
(4,),
(1, 2),
(1, 3),
(1, 4),
(2, 3),
(2, 4),
(3, 4),
(1, 2, 3),
(1, 2, 4),
(1, 3, 4),
(2, 3, 4),
(1, 2, 3, 4)]
Хорошо, теперь я хочу перетасовать этот список и разделить его на заданное количество партий. Я делаю:
def generateBatches(lst, batch_size):
random.shuffle(lst)
nr_batches = np.ceil(len(lst) / float(batch_size))
return [lst[int(round(batch_size * i)): int(round(batch_size * (i + 1)))] for i in range(int(nr_batches)) ]
generateBatches(data_list, batch_size=2)
, который возвращает:
[[(2, 3, 4), (1, 2, 3, 4)],
[(4,), (1, 3)],
[(3, 4), (1,)],
[(1, 3, 4), (1, 2, 3)],
[(2,), (1, 2, 4)],
[(1, 2), (2, 3)],
[(3,), (1, 4)],
[(2, 4)]]
Это именно то, что мне нужно, но оно не будет работать для больших списков ввода. У меня будут списки из 100-150 000 элементов (не в любом порядке, они могут быть [12, 3234, 121, 25626 ...], и они не обязательно могут быть отсортированы, чтобы сделать, скажем, все числа от 1 до 100 000 Они просто ярлыки).
Как я могу переписать этот код, предпочтительно используя какой-то итератор / генератор, который не создает ни промежуточный, ни окончательный список, но каким-то образом позволил бы мне пройти oop до последнего.
В конечном итоге я просто хочу запустить для l oop окончательный список, распределить его по партиям и распараллелить. Как я могу получить на вход этого для l oop?