У меня есть словарь с очень большим количеством ключей ( ~ 300k и растущий) и в качестве значений он имеет наборы, которые также имеют большое количество элементов ( ~ 20k ).
dictionary = {
1: {1, 2, 3},
2: {3, 4},
3: {5, 6},
4: {1, 5, 12, 13},
5: set()
}
Я хочу создать два массива:
keys = [1 1 1 2 2 3 3 4 4 4 4]
items = [1 2 3 3 4 5 6 1 5 12 13]
, которые в основном представляют собой сопоставление каждого элемента в каждом наборе вместе с соответствующим ключом.
Я пытался использовать numpy для этой работы, но это все еще занимает очень много времени, и я хочу знать, можно ли его оптимизировать.
numpy код:
keys = np.concatenate(list(map(lambda x: np.repeat(x[0], len(x[1])), dictionary.items())))
items = np.concatenate(list(map(lambda x: list(x), dictionary.values())))
keys = np.array(keys, dtype=np.uint32)
items = np.array(items, dtype=np.uint16)
return keys, items
Вторая часть - попытка уменьшить объем памяти этих переменных для учета их соответствующих типов данных. Но я знаю, что они будут по умолчанию использовать 64-битные переменные в первых двух операциях (до применения изменения dtype), поэтому память будет выделена, и у меня может закончиться ОЗУ.