Комментарии 10
Если не ошибаюсь, в примере с пулом процессов переключение между процессами делается слишком часто. Если в calc_num_matches передавать не одну строку, а chunk из 1000-5000 строк, то работает ещё в 2 раза быстрее.
cProfile, по моему опьіту, неправильно подсчитьівает время функций. Случалось, что после рефакторинга профайлер показьівал ускорение, но простой хронометраж - наоборот замедление :(
Хорошо бы ещё почитать про анализ потребления памяти, это тоже полезно, особенно когда начинаешь ловить OOM. Я пока нашёл такое решение:
Шаг 1: pip install memory_profiler
Шаг 2: В коде from memory_profiler import profile
Шаг 3: В коде навешиваем декоратор @profile над нужными функциями (если не вешать, чуда не будет)
Шаг 4: Запускаем python -m memory_profiler your_script <your_args>
Шаг 5: Ждём, наслаждаемся выводом на экран
P.S. Судя по PyPi сама либа уже никем не сопровождается. Но пока работает (проверял на Python 3.11.2)
Для профилирования использования памяти Python есть как минимум несколько инструментов:
Вышеупомянутый Scalene (https://github.com/plasma-umass/scalene) умеет профилировать память
Filprofiler https://github.com/pythonspeed/filprofiler
У них у всех есть разные плюсы и минусы (оверхед, подсчет использования памяти во внешнем коде и тредах/процессах итп), так что стоит сравнить что будет удобнее в конкретном случае
99,999 % времени исполнения моего скрипта (14 секунд) занимает строчка:
import pandas
Q: Профилирование Python — почему и где тормозит ваш код
A: Потому что он написан на Python
Не всегда. Иногда - потому что так написаны запросы к БД.
Профилирование Python — почему и где тормозит ваш код