На самом деле я не вижу возможности значительно улучшить использование памяти вашего текущего алгоритма. Вы используете итераторы вместо непосредственного создания новых списков / диктовок, поэтому единственное значительное использование памяти происходит из исходного словаря и нового инвертированного словаря.
Если у вас недостаточно ОЗУ для запуска этого алгоритма с фактически используемым словарем, все, что я могу придумать, - это как-то избежать одновременного сохранения в памяти как исходного, так и инвертированного слова. Один из способов сделать это состоит в том, чтобы удалить элементы из исходного дикта, когда вы добавляете их к инвертированному диктату, что можно сделать так:
def invert(old_dict):
inverted = collections.defaultdict(list)
while old_dict:
k,v = old_dict.popitem()
for vi in v:
inverted[vi].append(k)
return inverted
(обратите внимание, что я также использовал defaultdict
для упрощения кода, но если вам действительно нужен чистый dict
, а не подкласс, вы можете сделать что-то похожее на то, что вы изначально использовали с try
/ except
) * +1010 *
Если вы хотите, чтобы после завершения работы алгоритма оставались доступными как исходные, так и инвертированные словари, все, что я могу придумать, - это сохранить их в дисковых файлах и найти какой-то способ загрузить только фрагмент за раз. Я не знаю ни одного стандартного модуля Python, который мог бы хранить dict на диск и загружать только его часть за раз, поэтому вам, возможно, придется написать свой собственный код для этого.