Именование ключей dict для быстрого поиска в python

У меня будет 1 маленький словарь (от 5 до 20 ключей), на который будет ссылаться до ста раз или около того для загрузки одной страницы в python 2.5.

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

5 Solutions collect form web for “Именование ключей dict для быстрого поиска в python”

Я должен был проверить 😉

с помощью

  • f1, целочисленный ключ 1
  • f2 короткая строка, "one"
  • f3 длинная строка "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

как один из ключей в словарь длиной 4. Итерируя 10 000 000 раз и измеряя время. Я получаю этот результат:

 <function f1 at 0xb779187c> f1 3.64 <function f2 at 0xb7791bfc> f2 3.48 <function f3 at 0xb7791bc4> f3 3.65 

Т.е. нет разницы …

Мой код

Могут быть разумные имена для них, которые просто так производят имена, чьи хэши не сталкиваются. Однако CPython dicts уже является одной из наиболее оптимизированных структур данных в известной вселенной, создавая несколько коллизий для большинства входов, хорошо работает с хеш-схемами других встроенных типов, быстро разрешает столкновения и т. Д. Очень маловероятно, что вы увидите любая выгода вообще, даже если вы что-то нашли, тем более, что сотни поисков на самом деле не так много.

Возьмем, к примеру, этот тест времени, который запускается на моем 4-летнем настольном компьютере (спортивный бюджетный двухъядерный процессор с 3,1 ГГц)

 ...>python -mtimeit --setup="d = {chr(i)*100: i for i in range(15)};\ k = chr(7)*100" "d[k]" 1000000 loops, best of 3: 0.222 usec per loop 

И эти строки в десятки раз больше, чем все, что удобно для ввода вручную в качестве имени переменной. Сокращение длины от 100 до 10 приводит к 0,0778 микросекундам на поиск. Теперь измерьте скорость загрузки вашей страницы и сравните ее (в качестве альтернативы, просто подумайте, как долго будет работать ваша работа при создании страницы); и учитывать кэширование, накладные расходы на инфраструктуру и все это.

Ничто из того, что вы делаете в этом отношении, не может повлиять на производительность, период, полную остановку.

Поскольку хэш-функция строки Python выполняет итерацию по символам (по крайней мере, если это все еще применимо), я бы выбрал короткие строки.

Чтобы добавить еще один аспект:

для очень маленьких словарей и сильных временных ограничений время вычисления хэшей может быть существенной частью общего времени. Следовательно, для (скажем) 5 элементов может быть быстрее использовать массив и последовательный поиск (конечно, завернутый в некоторый объект MiniDictionary), возможно, даже увеличенный двоичным поиском. Это может найти элемент с 2-3 сравнениями, которые могут быть или не быть быстрее, чем хеш-вычисления плюс одно сравнение.

Разрыв зависит от скорости хэша, среднего количества элементов и количества ожидаемых столкновений, поэтому необходимы некоторые измерения, и нет ответа «один размер для всех».

Словари Python имеют быстрый путь для строковых ключей, поэтому используйте эти (а не, скажем, кортежи). Хэш-значение строки кэшируется в этой строке, поэтому более важно, чтобы строки остались теми же, что и их фактическое значение; Строковые константы (т. е. строки, которые дословно отображаются в программе и не являются результатом вычисления) всегда остаются одинаковыми, поэтому пока вы их используете, не нужно беспокоиться.

  • Подсчитать количество записей по дате в Django
  • Нет модуля с именем _imagingft
  • не удается создать проект django с помощью командной строки Windows
  • TimedRotatingFileHandler не работает нормально в Django с несколькими экземплярами
  • Django: Получить объект из БД или «Нет», если ничего не соответствует
  • Предоставление Django загружаемых файлов
  • Расширьте поле изображения, чтобы разрешить PDF (django)
  • Django STATIC_URL не работает
  • Проблемы с конфигурацией с django и mod_wsgi
  • Django REST Framework, как добавить контекст в ViewSet
  • Django, REST: сериализуйте текстовый или графический файл для публикации через HTTP в JSON
  • Python - лучший язык программирования в мире.