Есть list из 100 000 заблокированных идентификаторов пользователя в переменной banned. Для каждого из миллиона событий нужно проверить, заблокирован ли пользователь. Как ускорить проверку?

AПреобразовать banned в tuple: проверка через in у кортежа выполняется быстрее, чем у списка
BПреобразовать banned в set: проверка через in в среднем за O(1) через хеш-таблицу
CОставить list и применять модуль bisect: бинарный поиск даёт ускорение по сравнению с перебором
DОтсортировать list функцией sorted: оператор in после сортировки переключится на бинарный поиск
Правильный ответ. Проверка принадлежности у set работает за O(1) в среднем, а у list — за O(n). Для массовых проверок set значительно быстрее.

Разбор

list проверяет принадлежность последовательным перебором элементов — O(n). set использует хеш-таблицу, поэтому проверка принадлежности занимает O(1) в среднем. При 100 000 элементах и миллионе проверок разница огромна. Сортировка list не помогает: оператор in у list не использует бинарный поиск, а всегда делает линейный перебор. У tuple логика та же, что и у list.

Проверь себя · 1/3разбор после ответа
Дан список nums = [10, 20, 1, 30]. Чем отличаются nums.remove(1) и del nums[1]?
Тренировать Python в Telegram

Ещё вопросы по теме «Коллекции и структуры данных»