Нет ничего более быстрого, чем словарь для этой задачи, и это связано с тем, что сложность его индексации и даже проверки членства примерно равна O (1).
После сохранения ваших товаров в словаре вы можете получить к ним доступ в постоянное время. Тем не менее, проблема заключается не в процессе индексирования. Но вы можете сделать процесс немного быстрее, выполнив некоторые изменения в ваших объектах и их типах. Это может привести к некоторым оптимизации в рамках операций капота. Например, если ваши строки (ключи) не очень большие, вы можете ставить их в очередь, чтобы их обналичивали в памяти, а не создавали как объект. Если ключи в словаре интернированы и ключ поиска интернирован, сопоставление ключей (после хэширования) может быть выполнено с помощью сравнения указателей вместо сравнения строк. Это делает доступ к объекту очень быстрым. Python предоставил функцию intern()
в модуле sys
, который вы можете использовать для этой цели.
Введите строку в таблицу «интернированных» строк и верните интернированную строку, которая является самой строкой или копией. Интернирование строк полезно получить немного производительности на поиск в словаре ...
Вот пример:
In [49]: d = {'mystr{}'.format(i): i for i in range(30)}
In [50]: %timeit d['mystr25']
10000000 loops, best of 3: 46.9 ns per loop
In [51]: d = {sys.intern('mystr{}'.format(i)): i for i in range(30)}
In [52]: %timeit d['mystr25']
10000000 loops, best of 3: 38.8 ns per loop
Если вы используете Python 3.5 или ниже, то [словарь встроенный в Python 3.6, как говорят, на 20-25% быстрее, чем старый словарь в Python встроенных команд 3.5] (HTTP: //stackoverflow.com/questions/39980323/dictionaries-are-implemented-as-ordered-in-cpython-3-6).Таким образом, вы можете получить более высокую производительность, используя последнюю стабильную версию Python. –
Если ваш код ничего не сделает, я был бы очень удивлен, если бы ваш словарь был узким местом. У вас есть профилирующая информация, показывающая, что это проблема? – DSM
Я думаю, что дикт довольно быстро. Вместо того, чтобы находить альтернативу, вы рассматриваете возможность оптимизации остальной части вашего кода :) –