Как интернировать ключи словаря строки в Python? - PullRequest
0 голосов
/ 21 сентября 2019

После прочтения этой интернирующей строки может помочь производительность.Должен ли я просто сохранить возвращаемое значение из вызова sys.intern в словаре в качестве ключа и это все?

t = {}
t[sys.intern('key')] = 'val'

Спасибо

1 Ответ

1 голос
/ 26 сентября 2019

Да, именно так вы и будете его использовать.

Чтобы быть более точным в отношении производительности, документ утверждает, что:

Полезные строкичтобы получить небольшую производительность при поиске в словаре - если ключи в словаре интернированы, а ключ поиска интернирован, сравнение ключей (после хеширования) может быть выполнено сравнением указателя вместо сравнения строк.

В (классическом) поиске dict есть два шага: 1. хешировать объект в число, являющееся индексом в массиве, в котором хранятся данные;2. переберите ячейку массива по этому индексу, чтобы найти пару (ключ, значение) с правильным ключом.

Обычно, второй шаг достаточно быстрый, потому что мы выбираем хеш-функцию, которая обеспечивает очень мало коллизий (разные объекты - один и тот же хеш).Но он все равно должен проверять ключ, который вы ищете, по каждому сохраненному ключу, имеющему тот же хеш.Это шаг 2, который будет быстрее: идентичность строк проверяется перед дорогостоящим тестом, символ за символом, на равенство строк.

Шаг 1 сложнее ускорить, поскольку вы можете хранить хэш вместе синтернированная строка ... но вы должны вычислить хеш, чтобы найти интернированную строку.

Это была теория!Если вам действительно нужно повысить производительность, сначала сделайте несколько тестов.

Затем подумайте о специфике домена.Вы храните адреса IPv4 в качестве ключей.Адрес IPv4 - это число от 0 до 256 ^ 4.Если вы замените удобное для пользователя представление адреса целым числом, вы получите более быстрый хеш (хэширование небольших чисел в CPython, если оно почти бесплатное: https://github.com/python/cpython/blob/master/Python/pyhash.c) и более быстрый поиск. Модуль ip_address может быть лучшим выбором в вашем случае.

Если вы уверены, что адреса находятся между границами (например, 172.16.0.0 - 172.31.255.255), вы можете попробовать использовать массив вместо dict.должно быть быстрее, если ваш массив не очень большой (замена диска).

Наконец, если этого недостаточно, будьте готовы использовать более быстрый язык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...