О разработке и не только
308 subscribers
18 photos
3 videos
935 links
Делюсь годными материалами, которые нахожу в сети. В основном по программированию, немного научпопа, софт-скилам и менеджменту.
Download Telegram
Не могу не поделиться один классным фреймворком - FastStream. Он существенно упрощает реализацию консьюмеров и продюсеров для RabbitMQ, Kafka и т.п. И за счёт этого позволяет сконцентрироваться на бизнес-логике. В комплекте идёт удобный DI (dishka), валидация через pydantic, генерация AsyncAPI, подключение по OpenTelemetry, метрики, мидлвари и куча клиентов. Настоятельно рекомендую!

И нет, FastStream решает более общую задачу, нежели Celery; так что сравнивать их некорректно.

https://habr.com/ru/articles/822505/ #python
👍8
Ну вот фоновые задачи добрались и до Django. У меня по этому случаю смешанные чувства: с одной стороны фиче-паритет с FastAPI, с другой - а стоит ли их использовать? Типичных проблем из теории очередей они не решают. Нет ни персистентности, ни повторов, но хуже - смешение в одном контейнере разных типов нагрузки. Т.е. если фоновая задача затупит или начнёт жрать CPU, то хелсчек может и не успеть пройти, и контейнер будет убит. Получается, из-за неё умрёт вполне рабочий процесс веб-приложения. Звучит как-то странно.

Альтернатива - Celery. Да, это очень навороченный фреймворк, но ведь Postgres и Redis у вас уже есть в проекте? Ну будет ещё плюс одна зависимость (и небольшое усложнение инфраструктуры). Зато надёжнее будет работать.

https://www.bitecode.dev/p/whats-up-python-django-background #python
👍2
pytest - непростой фреймворк. Это мощный комбайн, под капотом которого происходит много действий (в том числе и магических). Поэтому если вы хотите подружится с ним, понять и принять, то лучший способ - покопаться в его внутрянке и решить какую-то учебную задачу. Например, переделать вывод результатов во что-то более читаемое.

P.S. Бонусом идёт список полезных материалов по pytest на самом Хабре в конце статьи.

https://habr.com/ru/articles/844728/ #python
🔥41👍1👏1
За прошлую неделю мне попалось несколько материалов на тему оптимизации python. Перечислю здесь основные:
- суперинструкции - объединение связанных опкодов в один
- специализация - подстановка специализированной функции сложения двух целых чисел вместо обобщённой (как пример)
- векторизация вызовов - больше не создаются промежуточные структуры при вызове функций

Даже без jit ускорение в полтора-два раза уже хорошо. Хотя нужно ли считать специализацию частью jit? 🤔

https://habr.com/ru/companies/beget/articles/839348/ и https://www.youtube.com/watch?v=G_KCQ0dniv0.
https://pypi.org/project/specialist/ - библиотека, которая подсвечивает оптимизированный код.
Добавил также ссылки в свой blue-book. #python
👍3
Хорошая статья, которая подробно описывает что может делать pydantic. На самом деле не так чтобы много (зато исчерпывающе) - конвертация данных, валидация да связь с ORM.

Но читая, я вспомнил те времена, когда в python ещё не было типизации. И я не помню, чтобы было много ошибок с этим связано. Возможно, потому что с типами работали более аккуратно. Если число - то только int, а не str(int); если поле опционально - то оно всё равно требуется в схеме, хоть и с None значением. Но такое ощущение, что современные инструменты поощряют подобную небрежность. Не ведитесь! Это провокация! Используйте strict=True.

https://habr.com/ru/companies/amvera/articles/851642/ #python
👍5
Хороший доклад-наброс на Go, у самого схожие мысли. Особенно понравилось про git-вандализм и simple vs easy. Не знаю к сожалению или к счастью, но за 8 лет так и не попалась задача, которую бы стоило решать именно на Go.

И поддержу спикера - у всех языков есть странности. Вопрос насколько вы готовы их принять.

https://www.youtube.com/watch?v=jkem38kdX50&list=WL&index=105 #python #golang
😁41👍1🤔1💩1
Опубликовал новую статью на Хабре. В ней подробно разбираю как работает новый интерпретатор в python. Воробушкам от хлебушка, чтобы вот всем было понятно. Буду признателен за лайки на Хабре.

https://habr.com/ru/companies/tochka/articles/895004/ #python
👍14🔥2
Хорошее исследование по SSTI (Server-side template injection) - возможности запустить код через шаблонизатор. Для взаимодействия с клиентом их, по сути, всего 2: Jinja2 и Django templates. Всякие mako могут использоваться только для генерации sqlalchemy миграций да каких-нибудь конфигураций. Так вот, авторам первых двух приходится отчаянно бороться между удобством/функциональностью и безопасностью. Я за второй вариант. А победителя вы узнаете в статье.

https://habr.com/ru/companies/bizone/articles/896556/ #python
👍3
В этом сезоне Podlodka Python Crew мы решили выбрать один самый полезный с практической точки зрения доклад и опубликовать его бесплатно. Я активно участвовал в его подготовке, и считаю, что он получился просто 🔥 Настоятельно рекомендую его посмотреть, т.к. перечисленные не очевидные моменты могут больно выстрелить на проде.

https://www.youtube.com/watch?v=6LdhvDU8KSM #python
👍8
В python добавляют очередной тип строк, который явно разделяет шаблон и его аргументы. Выглядеть это будет примерно так:
attributes = {"src": "shrubbery.jpg", "alt": "looks nice"}
template = t"<img {attributes:.2f} />"
assert html(template) == '<img src="shrubbery.jpg" alt="looks nice" />'
assert template.strings == ("<img ", " />")
assert template.interpolations == attributes
assert template.interpolations[0].format_spec == ".2f"

Т.е. html - кастомная функция, которая разворачивает аргумент-словарь у строки в набор тегов. Я вот так сходу не могу придумать мест применения, кроме экранирования секретов в логах. Но во-первых, это решается по-другому (своим логгером), а во-вторых, уже есть string.Template, который делает нечто похожее. Ну ладно, ещё защита от инъекций (XSS, SQL и т.п.), но там это делается совсем другим способом.

В общем, меня не покидает ощущение, что python становится слишком фичастым. И когда-нибудь это обязательно стрельнет.

https://habr.com/ru/articles/911196/ #python
3👍2😱1
Кто-то считает DjangoORM злом, а я думаю, что инструментом просто надо уметь пользоваться. А т.к. это обёртка над другой технологией, то надо разбираться и в ней. Вот хорошая и лёгкая для чтения статья как в действительности DjangoORM работает с БД. Приведены некоторые оптимизации, нюансы использования и т.п. Хороший кандидат, кстати, для перевода на Хабр.

Но не нужно применять все эти хаки постоянно. ИМХО, они нужны больше для оптимизации - когда действительно что-то идёт не так. Какая разница сколько у вас индекс весит, если база нагружена на 20% и свободного места ещё 100Gb.

https://hakibenita.com/django-foreign-keys #python
👍43
Уже через несколько дней я выступаю на PyCon с докладом про эволюцию CPython. В процессе подготовки пришлось перелопатить кучу материала одна из причин, почему вы должны выступать на конфах. И конечно же, нельзя обойти стороной инициативу Faster CPython. По ней сообщество хотело ускорить CPython в 5 раз до 2027 года. К сожалению, это уже вряд ли осуществимо из-за массовых увольнений в Microsoft, но прогресс есть. По сравнению с 3.10 версия 3.14 работает минимум на 50% быстрее. И вот основные направления:
- tail-calling интерпретатор
- free-threading Python
- многопоточка через сабинтерпретаторы
- Copy-and-Patch JIT
- JIT через трейсинг

Вот про виды JIT и идёт речь в докладе. Спикер рассказывает какой путь проходит строчка python-кода, какие оптимизации уже реализованы, а какие планируются в следующем релизе.

https://www.youtube.com/watch?v=NE-Oq8I3X_w #python
👍155🔥5
Состоялся релиз документального фильма про CPython. Ух, я его аж с июня ждал :popcorn: Рассказывают сами разработчики как язык вырос из пет-проекта, завоевал мир, а потом чуть не рухнул. Даже перевода ждать не буду. Теперь у вас есть что посмотреть в воскресенье 😉 Потому что в субботу жду на конфе 😁

https://www.youtube.com/watch?v=GfH4QL4VqJ0 #python
5🔥4
Работать с памятью - сложно, а дёргать malloc каждый раз - дорого. Поэтому почти во всех языках программирования реализован свой менеджер памяти. Да, они могут отличаться, но суть одна - выделяем сразу большой объём, а уже пользовательские объекты распределяем в нём. Из плюсов - быстро; из минусов - память обратно в ОС может и не вернуться. Так что во многих веб-серверах, которые должны работать долго => память будет утекать, придумали костыль в виде харакири. Процесс просто перезапускается после того, как обслужил N запросов.

Статья ещё хороша тем, что есть приложение на PyQt5 с визуализацией процесса выделения памяти и размещения объектов. Помню, на втором курсе получил самоэкзамен за подобную разработку (но только на object pascal).

https://habr.com/ru/companies/ntechlab/articles/946098/ #python
🔥32
Довольно частая задача - отправить 100500 http-запросов в какой-нибудь сервис. Тут на примере небольшого приложения показаны примитивы синхронизации, а также важные вещи типа повторов и таймаутов. Плюс в комментах ещё идей накидали.

https://habr.com/ru/articles/963880/ #python
👍1🔥1
В последнее время часто встречаю упоминание новой библиотеки логирования loguru. Я, конечно, рад ещё одному инструменту, но зачем? У нас уже есть structlog, если нужен подробный и красивый вывод в консоль; json_log_formatter, если нужно только форматирование в json; да и стандартный логгер не так уж плох, если в нём разобраться.

И скорее всего я не буду использовать loguru. Это внешная зависимость, которой не будет на 98% проектах. Она, конечно, красивая, но как-нибудь обойдусь. Лучше инвестировать время в изучение каких-то базовых вещей — например, logging. Он есть везде, концепций не так много, но их достаточно для гибкости. Написать свой логгер не так чтобы сложно... А плюсом вы получите понимание работы логирования и в другом языке. Никогда не задумывались почему в пакете logging функции записаны в camelCase? 😉

https://habr.com/ru/articles/966048/ #python
4
А тем временем вышла новая мажорная версия Django. У меня к этому фреймворку давняя любовь; я умею его готовить и надеюсь к нему вернуться :)

Заметил, что он вобрал в себя много сторонних пакетов, которые доказали свою полезность. Итак, из интересного:
- выполнение отложенных задач
- улучшение Content Security Policy
- автоимпорт пакетов в ./manage.py shell
- встроенный тип поля модели StringAgg

Интересный получился релиз. И если хочется поиграться с отложенными задачами, то вот подробная инструкция. Главное, разделяйте рантайм и фоновую нагрзуки, чтобы работа в фоне не аффектила запросы пользователей.

UPD. Нашёл перевод

https://adamj.eu/tech/2025/12/03/django-whats-new-6.0/ #python
2👍2🔥1
Не так всё однозначно ©️

Подоспел очередной бенчмарк версий CPython (3.10 - 3.14). В целом, конечно, производительность улучшилась, но есть и деградация. Например, pickle/unpickle (что может быть важно для ML), работа с json и корутинами.

https://en.lewoniewski.info/2025/python-314-vs-313-312-311-310-performance-testing-video/ #python
👍31
This media is not supported in your browser
VIEW IN TELEGRAM
Что-то за последнюю неделю было много задач по профилированию python приложений. Делюсь тем, что раскопал.

1. Профилировку по памяти удобней всего делать через memray. Всего python3 -m memray run example.py, а потом memray flamegraph memray-example.py.11235.bin. А он сам строит красивые графички, таблицы и пр. Умеет также цепляться к работающему процессу. Прям настоятельно рекомендую - после всех предыдущих оставил приятное впечатление.
2. В 3.15 обещают завезти сэмплирующий профайлер Tachyon. Он будет уметь цепляться к работающему процессу python -m profiling.sampling attach --subprocesses 12345, замерять разные тайминги (CPU, GIL, exception), что более чем хватило бы для решения большинства задач. Интерактивный пример результата. А ещё он умеет красиво выводить в real-time в терминал (см gif). Правда, не знаю зачем это может пригодится. Но красивое.
3. Но до 3.15 ещё дожить надо 😕 Так что воспользовался библиотекой tprof, которая умеет профилировать не всю программу, а только заданные функции. Удобно в коде держать и старую, и новую и итеративно оптимизировать.
4. Не забываем про классику py-spy, хотя её вывод для меня показался сложноватым.

Получился вот такой краткий обзор современных профилировщиков :) А если захотите написать свой, то вот статейка как они работают под капотом.

#python
👍94🔥2