Для точного скользящего окна храните очередь времён допущенных вызовов по clientid. Перед новым вызовом удалите события старше окна и сравните оставшееся количество с limit.
Блокирующая для event loop операция долго не возвращает ему управление. Это бывает не только при I/O: построение списка из миллиарда элементов также занимает поток и огромный объём памяти.
aiohttp интегрирован с event loop и отдаёт управление на ожидании сетевого I/O. requests предоставляет синхронный интерфейс и удерживает вызывающий поток до завершения операции.
Декоратор принимает функцию или класс и возвращает объект, который будет связан с прежним именем. @decorate над def f соответствует применению f = decorate(f).
list — изменяемая последовательность, tuple — неизменяемая последовательность. Кроме них в Python есть dict для пар ключ—значение и set/frozenset для уникальных элементов.
Генератор выдаёт значения по мере обхода через yield, не создавая всю последовательность сразу. Контекстный менеджер задаёт вход и выход из блока with, в том числе очистку при исключении.
pandas — библиотека табличного анализа в одном процессе, PySpark — Python-интерфейс распределённого Spark, а Polars использует колоночный движок с параллельным выполнением и ленивыми запросами.
Файлы открывают через open с нужным режимом и закрывают через контекстный менеджер with. Для текста указывают кодировку, для бинарных данных используют режимы rb и wb.