profile work Python perf nolife
И тут же, с помощью
#2772368 почти без боли отладили проблему с производительностью в продакшене. Прохладительная история:
Есть бесконечно крутящаяся прожка, собирающая логи с некоторыми данными и некоторым образом их обрабатывающая. Периодически она продолжительно выедает ядро цпу, что само по себе не было бы проблемой, если бы логи не накапливались быстрее, чем прога успевает их обрабатывать.
Многие в таких ситуациях начинают искать по коду, что бы соптимизировать. Конечно, есть горстка хрупких эвристик, с помощью которых иногда можно быстро сузить поиск, но это, скорее, запутывает, поэтому следует запомнить и взять в привычку один метод — если сходу или за условные 15 минут не удаётся выявить точную ясную и полную логику проблемы, дальше продолжать бессмысленно и вредно, и необходимо воспользоваться специальными инструментами. Профайлером.
Ситуацию осложняет, однако, традиционное для индус-трии отсутствие вменяемых инструментов (почти для чего-либо вообще). То они тупо не работают, то не хватает функционала, то имеют грабительские цены (и работают ещё хуже), то установка или уровень удобства вызывает бешенство, и так далее. На этом многие ловят баттхёрт и возвращаются к отлаживанию по положению звёзд и кофейной гуще. Но, если ты у мамки настоящий инженер™, ты должен сохранять буддийское спокойствие и или заколотить-таки гвоздь подручным микроскопом, или быстренько™ сделать свой инструмент.
Long story short, запилил подходящий профайлер, посекундно выводящий, какие места в коде были самими горячими. В итоге, время процессора оказалось неожиданно тонко размазано по разным участкам цикла. На первый взгляд, это озадачивает, но всё логично — все манипуляции в этом цикле хавают примерно одинаковое время — затык в "языке" (интерпретаторе, стдлибе и т.п.). Но не только — если даже максимум вымазаться байтами, если поток логов ещё вырастет, оно может опять начать упираться в ядро. Собрали вече, решили, что эффективнее начать с распараллеливания, но это уже другая история.
Мораль — если тормозит, учитесь профайлить и профайлите без особых раздумий. Даже если окажется что-то "ожидаемое" или "очевидное" (я, кстати, ожидал увидеть другое, в данном случае), время будет потрачено не зря.