Создание простого загрузчика данных для комбинаций в python - PullRequest
1 голос
/ 12 апреля 2020

Допустим, у меня есть список элементов [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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...