Как я ускорил обработку логов Python в 800 раз
Решил проверить на практике, где заканчивается Python и начинаются компилируемые языки. Взял реальную задачу: разбор логов веб-сервера (миллион записей) и подсчёт уникальных посетителей по разным фильтрам. Сравнил несколько реализаций: обычный словарь Python, SQLite, библиотеку Roaring Bitmap, скомпилированную в бинарный модуль, а также простые отсортированные списки, целиком написанные на компилируемых языках.
Результат: решение на компилируемом языке оказалось в 20–800 раз быстрее Python (в зависимости от того, что мы делаем: проверяем наличие одного элемента или ищем пересечение - от 21× на проверке одного элемента до 842× на пересечении) и в 150 раз меньше по оперативке (131 КБ вместо 20 МБ). К слову, Python никуда не исчез: он считал файл, передал данные в модуль, и забрал обратно. Так что интеграция этих модулей в Python-проект не порушит код. И это еще при условии, что я тестировал на одном ядре античного Intel Pentium P6200 пятнадцатилетней давности…
Попутно выяснилось, что оптимизировать код на чистом Python без библиотек иногда бывает бессмысленно: правильная структура данных в Python оказалась в 6 раз медленнее обычного словаря, потому что встроенные функции Python уже написаны на компилируемом языке и работают быстрее, чем самописные циклы.
Весь код, замеры и счётчики процессора: https://github.com/garantiatsverga/roaring-bitmap-cmp. Могу также написать, как встроить в ваш Python-проект.