Содржина на објавата
В прошлом посте мы закешировали строки в таблицу “interned strings” И что мы получаем от этого? Прирост скорости достаточно мал и не будет заметен. Экономия памяти уже получше, но реально увидеть различия можно только на больших массивах данных. Где тогда это применять? 🔸Пример 1 Если вы делаете синтаксический разбор большого текста, вполне имеет смысл закинуть в кеш часто встречающиеся части текста. Например, самые популярные слова. Если их наберется несколько миллионов по всему тексту, то уже хорошая экономия памяти. Да, короткие слова Python сам кеширует, но если вы прочитали их из файла то это следует сделать самостоятельно. 🔸Пример 2 В "этих ваших интернетах" часто приводят такой пример: Функция intern() помещает строку в таблицу, либо возвращает ссылку на тот же объект если строка там уже есть. И это может очень пригодится для сравнения больших строк. Ведь оператор "is", проверяющий совпадение адреса в памяти, работает куда быстрей чем оператор "==", сравнивающий все символы в строке. Мы можем закинуть в кеш две строки и просто сравнить их через оператор "is". Синтетический тест сравнения показывает прирост скорости в 50-55 раз. Но так ли часто нам надо сравнивать две большие и одинаковые строки столько раз? Этот тест лишь показывает разницу в скорости операторов и тот факт что intern() действительно делает две переменные одним объектом. Давайте сделаем иначе, вторую строку будем создавать в каждой итерации и сравнивать с эталоном, созданным один раз. И тут мы получаем просадку по скорости в 10 раз😕! Почему? Могу предположить, что intern() для добавления строки в таблицу делает обычное сравнение с другими элементами таблицы, и лишь потом выдаёт результат. То есть, для добавления строки в кеш проверка посимвольно всё равно происходит, но только добавляется еще ряд других операций. В итоге никакой выгоды не получаем. Итого Выходит, что самый модный пример про функцию intern() не очень-то пригоден в работе. Реальный профит мы получим если будем использовать эту функцию аналогично задумке её основному назначению — кеширование часто используемых строк, то есть первый пример. #tricks#libs