Максимальный размер словаря в Python?

Я использую словарь python для хранения большого количества объектов и имею строковое имя для каждого из них. Чтобы быть конкретным, вот мой код:

from itertools import product
for (i,j,k) in product(range(N),range(M),range(K)):
    var_name='x_'+'_'+str(i)+str(j)+'_'+str(k)
    var_dict[var_name] = f(var_name,other_params)
print len(var_dict)

f(...) возвращает объект. В моем коде N=363, M=500 и K=2. Поэтому я ожидаю 363000 записей в словаре. Но когда я проверяю длину var_dict, это 330860!!!

(Pdb) len (var_dict) 330860

вот мои вопросы: 1)Есть ли объяснение этому? Е. Г. есть ли предел количество элементов, которые может адресовать встроенная хэш-таблица python?

2) что я могу сделать, чтобы решить эту проблему?

спасибо!

3 ответов


проблема:

str(i)+str(j)

это не создает уникальных идентификаторов. Например, значение, установленное при i=1 и j=11 будет перезаписано значением, установленным при i=11 и j=1 (есть еще много примеров, а также).

вы можете исправить проблему, вставив некоторый символ разделителя между двумя числами (например, подчеркивание, как у вас есть между j и k).


у вас нет разделителя между i и j в построенных строк, поэтому туплю как (12, 1, 0) и (1, 21, 0) произвести такое же имя. Если возможно, не делайте имен для этих вещей вообще; просто используйте цифры напрямую:

var_dict[i, j, k] = f(i, j, k, other_params)

если f действительно нужно взять строку, изменить конструкцию имени, чтобы поставить разделитель между i и j:

var_name = 'x_{}_{}_{}'.format(i, j, k)

и, если возможно, используйте Кортеж в качестве ключа dict, даже если f нужен строка:

var_dict[i, j, k] = f(var_name, other_params)

нет размера ограничения на dict

d = {}
for i in xrange(999999):
    d[i] = i
len(d)

печати

999999